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,则新增一条。
具体代码如下
+ (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
学习记录,每天不停进步。
相关文章:
WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制
WebRTC音视频通话-新增或修改SDP中的码率Bitrate限制参数 之前搭建ossrs服务,可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196 之前实现iOS端调用ossrs音视频通话,可以查看:https://blog.csdn.net/gloryFlo…...
深入理解与运用Android Jetpack ViewModel
在Android开发中,数据与界面的分离一直是一项重要的挑战。为了解决这个问题,Google推出了Android Jetpack组件之一的ViewModel。ViewModel是一种用于管理UI相关数据的架构组件,它能够帮助开发者实现优雅的数据驱动和生命周期管理。本文将深入…...
【数据库】P0 创建数据库环境 MySQL + DataGrip
创建数据库环境 下载安装 MySQL下载安装 DataGrip 下载安装 MySQL Windows版本_MySQL 下载地址: https://dev.mysql.com/downloads/mysql/ 下载后依照默认顺序安装即可,本博文将讲述简约安装步骤; 如需详细安装步骤可见:https:/…...
js设置css变量控制页面一行展示指定个数的元素
前置知识: CSS变量之var()函数的应用——动态修改样式 & root的使用 flex相关知识 场景: 动态设置给父元素内子元素设置每行排列几个 通过 document.body.style.setProperty(--itemNum, 5)设置样式变量,然后通过给父元素设置display: f…...
4.0 Spring Boot入门
1. Spring Boot概述 Spring Boot介绍 Spring Boot是Pivotal团队在2014年推出的全新框架,主要用于简化Spring项目的开发过程,可以使用最少的配置快速创建Spring项目。 Spring Boot版本 2014年4月v1.0.0.RELEASE发布。 2.Spring Boot特性 约定优于配…...
[国产MCU]-BL602开发实例-I2C与总线设备地址扫描
I2C与总线设备扫描 文章目录 I2C与总线设备扫描1、I2C介绍2、I2C驱动API介绍3、I2C使用实例I2C (Inter-Intergrated Circuit)是一种串行通讯总线,使用多主从架构,用来连接低速外围装置。 每个器件都有一个唯一的地址识别,并且都可以作为一个发送器或接收器。每个连接到总线的…...
Python Opencv实践 - 图像平移
import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR)#图像平移 #cv.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) # M是仿射变换矩阵,对于平移来说M是一…...
易服客工作室:WordPress 6.3性能改进
随着WordPress 6.3发布,本文总结了该版本的性能改进。虽然WordPress 6.2显著提高了Core的加载时间性能,树立了很高的标准,但WordPress 6.3性能改进已经超越了这些结果:根据进行的性能基准测试,与WordPress 6.2相比&…...
LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题
⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…...
山东布谷科技直播软件开发WebRTC技术:建立实时通信优质平台
在数字化的时代,实时通信成为了人们远程交流的主要方式,目前市场上也出现了很多带有实时通信交流的软件,实时通信符合人们现在的需求,所以在直播软件开发过程中,开发者也运用了实时通信技术为直播软件加入了实时通信的…...
Golang-语言源码级调试器 Delve
前言 Go 目前的调试器有如下几种: GDB 最早期的调试工具,现在用的很少。LLDB macOS 系统推荐的标准调试工具,单 Go 的一些专有特性支持的比较少。Delve 专门为 Go 语言打造的调试工具,使用最为广泛。 本篇简单说明如何使用 Del…...
构建Docker容器监控系统(Cadvisor +InfluxDB+Grafana)
目录 案例概述 Cadvisor InfluxDBGrafana 1.1、 Cadvisor 1.2、InfluxDB 1.3、Grafana 1.4、监控组件架构 1.5、开始部署 安装docker-ce 阿里云镜像加速器 创建自定义网络 创建influxdb容器 案例概述 Docker作为目前十分出色的容器管理技术,得到大量企业…...
【Vue3】keep-alive 缓存组件
当在 Vue.js 中使用 <keep-alive> 组件时,它将会缓存动态组件,而不是每次渲染都销毁和重新创建它们。这对于需要在组件间快速切换并且保持组件状态的情况非常有用。 <keep-alive> 只能包含(或者说只能渲染)一个子组件…...
24成都信息工程大学809软件工程考研
1.渐增式与非渐增式各有何优、缺点?为什么通常采用渐增式? 非渐增式是将所有的模块一次连接起来,简单、易行、节省机时,但测试过程难于排错,发现错误也很难定位,测试效率低;渐增式是将模块一个…...
Filament for Android 编译搭建(基于Ubuntu20.04系统)
一、Filament 源代码下载 github下载地址: 2、安装clang 我是直接安装clang-10 Ubuntu 20.04 ,sudo apt install clang 命令默认就是clang-10 $sudo apt-get install clang-10 # 安装 AST.h 等头文件 $sudo apt-get install libclang-10-dev $sudo …...
【MySQL--->数据库操作】
文章目录 [TOC](文章目录) 一、操作语句1.增2.删3.改4.查5.备份 二、字符集与校验规则 一、操作语句 1.增 语句格式:create database [if no exists]数据库名[create_specification [,create_specification] …]; 中括号内是可选项,if no exists是指如果数据库不存在就创建,存…...
PhotoShop2023 Beta AI版安装教程
从 Photoshop 开始,惊艳随之而来 从社交媒体贴子到修饰相片,设计横幅到精美网站,日常影像编辑到重新创造 – 无论什么创作,Photoshop 都可以让它变得更好。 Photoshop2023 Beta版本安装教程和软件下载 地址:点击…...
并发冲突导致流量放大的线上问题解决
事故现象 生产环境,转账相关请求失败量暴增。 直接原因 现网多个重试请求同时到达 svr,导致内存数据库大量返回时间戳冲突。业务方收到时间戳冲突,自动进行业务重试,服务内部也存在重试,导致流量放大。 转账 首先…...
Spring Cloud Gateway过滤器GlobalFilter详解
一、过滤器的场景 在springCloud架构中,网关是必不可少的组件,它用于服务路由的转发。对客户端进行屏蔽微服务的具体细节,客户端只需要和网关进行交互。所以网关顾名思义,就是网络的一个关卡。它就是一座城的城门守卫。所以这个守…...
【LeetCode】1281.整数的各位积和之差
题目 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 1: 输入:n 234 输出:15 解释: 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 9 结果 24 - 9 15示例 2&…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
