WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制

WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制参数

之前搭建ossrs服务,可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196

之前实现iOS端调用ossrs音视频通话,可以查看:https://blog.csdn.net/gloryFlow/article/details/132262724

之前WebRTC音视频通话高分辨率不显示画面问题,可以查看:https://blog.csdn.net/gloryFlow/article/details/132240952

这里WebRTC音视频通话过程中修改SDP中的码率Bitrate

一、SDP是什么?

SDP即Session Description Protocol(会话描述协议)

SDP由一行或多行UTF-8文本组成,每行以一个字符的类型开头,后跟等号(=),然后是包含值或描述的结构化文本,其格式取决于类型。如下为一个SDP内容示例:

v=0

o=alice 2890844526 2890844526 IN IP4

s=

c=IN IP4

t=0 0

m=audio 49170 RTP/AVP 0

a=rtpmap:0 PCMU/8000

m=video 51372 RTP/AVP 31

a=rtpmap:31 H261/90000

m=video 53000 RTP/AVP 32

a=rtpmap:32 MPV/90000

我这里本地获取的SDP完整数据如下

v=0

\no=SRS/6.0.64(Bee) 107408568903808 2 IN IP4 0.0.0.0

\ns=SRSPublishSession

\nt=0 0

\na=ice-lite

\na=group:BUNDLE 0 1

\na=msid-semantic: WMS live/livestream

\nm=audio 9 UDP/TLS/RTP/SAVPF 111

\nc=IN IP4 0.0.0.0

\na=ice-ufrag:4ahia260

\na=ice-pwd:11777k546394014cto09595g5em82339

\na=fingerprint:sha-256 26:AF:1F:AA:18:C0:4F:69:E3:19:B4:EF:9C:43:98:A9:E6:56:9A:2D:D4:2E:A8:31:D7:B1:C9:A1:08:CA:B2:13

\na=setup:passive

\na=mid:0

\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01

\na=recvonly

\na=rtcp-mux

\na=rtcp-rsize

\na=rtpmap:111 opus/48000/2

\na=rtcp-fb:111 transport-cc

\na=fmtp:111 minptime=10;useinbandfec=1

\na=candidate:0 1 udp 2130706431 169.254.136.162 8000 typ host generation 0

\na=candidate:1 1 udp 2130706431 192.168.10.100 8000 typ host generation 0

\nm=video 9 UDP/TLS/RTP/SAVPF 96 127

\nc=IN IP4 0.0.0.0

\na=ice-ufrag:4ahia260

\na=ice-pwd:11777k546394014cto09595g5em82339

\na=fingerprint:sha-256 26:AF:1F:AA:18:C0:4F:69:E3:19:B4:EF:9C:43:98:A9:E6:56:9A:2D:D4:2E:A8:31:D7:B1:C9:A1:08:CA:B2:13

\na=setup:passive

\na=mid:1

\na=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01

\na=recvonly

\na=rtcp-mux

\na=rtcp-rsize

\na=rtpmap:96 H264/90000

\na=rtcp-fb:96 transport-cc

\na=rtcp-fb:96 nack

\na=rtcp-fb:96 nack pli

\na=fmtp:96 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c33

\na=rtpmap:127 red/90000

\na=candidate:0 1 udp 2130706431 169.254.136.162 8000 typ host generation 0

\na=candidate:1 1 udp 2130706431 192.168.10.100 8000 typ host generation 0

\n

从上面的数据格式中可以看到

常见的比如

m代表media,

m=audio表示此行描述的是音频信息相关。

m=video代表此行描述的是视频信息相关。

a代表属性,比如a=candidate,表示这一行描述的是candidate信息。

以及涉及到分辨率的显示的profile-level-id 640c33

二、新增或修改SDP中的码率Bitrate限制参数

下面需要修改一下修改SDP中的码率Bitrate,如果没有b=AS,则新增一条。

具体代码如下

objectivec 复制代码
+ (NSString *)setMediaBitrate:(NSString *)sdp media:(NSString *)media bitrate:(int)bitrate {
    if (!(sdp && [sdp isKindOfClass:[NSString class]] && sdp.length > 0)) {
        return sdp;
    }
    
    NSMutableArray *lines = [NSMutableArray arrayWithArray:[sdp componentsSeparatedByString:@"\n"]];
    int line = -1;
    for (int i = 0; i < lines.count; i++) {
        NSString *start = [NSString stringWithFormat:@"m=%@",media];
        if ([lines[i] hasPrefix:start]) {
            line = i;
            break;
        }
    }
    
    if (line == -1) {
        NSLog(@"Could not find the m line for %@", media);
        return sdp;
    }
    
    NSLog(@"Found the m line for %@", media);
    line++;
    
    while ([lines[line] hasPrefix:@"i="] || [lines[line] hasPrefix:@"c="]) {
        line++;
    }
    
    if ([lines[line] hasPrefix:@"b"]) {
        NSLog(@"Replaced b line at line:%d", line);
        lines[line] = [NSString stringWithFormat:@"b=AS:%d", bitrate];

        return [lines componentsJoinedByString:@"\n"];
    }
    
    NSLog(@"Adding new b line before line:%d", line);
    NSMutableArray *newLines = [NSMutableArray arrayWithArray:[lines subarrayWithRange:NSMakeRange(0, line)]];
    
    NSMutableArray *aLeftLines = [NSMutableArray arrayWithArray:[lines subarrayWithRange:NSMakeRange(line, lines.count - line)]];
    
    NSString *aLineStr = [NSString stringWithFormat:@"b=AS:%d", bitrate];
    [newLines addObject:aLineStr];
    
    NSMutableArray *resultLines = [NSMutableArray arrayWithCapacity:0];
    [resultLines addObjectsFromArray:newLines];
    [resultLines addObjectsFromArray:aLeftLines];

    return [resultLines componentsJoinedByString:@"\n"];
}

效果图

三、小结

WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制参数。内容较多,描述可能不准确,请见谅。

https://blog.csdn.net/gloryFlow/article/details/132263021

学习记录,每天不停进步。

相关推荐
911hzh18 分钟前
Flutter 音视频通话集成实战:WebSocket 做信令,WebRTC 传音视频,附详细事件时序图
websocket·flutter·音视频
m0_726365839 小时前
Ai漫剧系统 几分钟,让AI 把一篇小说变成了一部漫剧成片:从剧本到视频的全流程系统实现
人工智能·语言模型·ai作画·音视频
非凡ghost13 小时前
可拓浏览器:给手机浏览器装上“外挂“!2W+拓展+AI搜索,玩出无限可能!
windows·智能手机·音视频·firefox
美狐美颜SDK开放平台14 小时前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
三十_15 小时前
WebRTC 远端画面无法显示:ICE 与 SDP 时序问题深度解析与解决方案
webrtc
ai产品老杨16 小时前
深度解析:基于国产化异构计算的 AI 视频管理平台架构——从 GB28181 接入到 NPU 边缘推流的解耦实践
人工智能·架构·音视频
watson_pillow16 小时前
音视频相关基础知识储备入门-字幕
音视频
程序员JerrySUN17 小时前
Jetson边缘嵌入式实战课程第二讲:JetPack 和 SDK Manager 是什么
c语言·开发语言·网络·udp·音视频
weixin_66819 小时前
NVIDIA VSSVideo Search and Summarization视频搜索与摘要蓝图详尽使用说明与技术报告版本
人工智能·音视频
jiayong2320 小时前
国内外视频/图像大模型与智能体工具平台竞品对比
ai·音视频·agent