WebRTC 减少播放时延

背景

产品未做优化的时候整段时延在网络状况良好的时候也有将近三四百毫秒。这对于时延要求比较高的场景是无法接受的,需要想办法去看下有没有优化的方案。

问题的排查

排查定位问题底层的思路,拆分法、控制变量法、搜索引擎,前人经验。

RTP拓展 播放时延(playout-delay)

这个方法是在WebRTC社区看到,忘记原贴地址了,WebRTC社区有了很多前人踩过的坑了,很多问题的思路可以在上面进行搜索

WebRTC 谷歌社区

这个方法是我想减少播放jitterBuffer的大小去减少播放时延发现的,这里的方法是官方文档的地址

webrtc.googlesource.com/src/+/refs/...

这个RTP拓展是RTP发送方想要改变接收方的播放延迟量限制在一定范围内,约定最小延迟和最大延迟。接收方会尽力交付,但是不一定会满足,和前端getUserMedia里面约束很像。

这里面有一定官方的指导值,我这里贴一下官方原话:

  • 0 ms: Certain gaming scenarios (likely without audio) where we will want to play the frame as soon as possible. Also, for remote desktop without audio where rendering a frame asap makes sense
  • 100/150/200 ms: These could be the max target latency for interactive streaming use cases depending on the actual application (gaming, remoting with audio, interactive scenarios)
  • 400 ms: Application that want to ensure a network glitch has very little chance of causing a freeze can start with a minimum delay target that is high enough to deal with network issues. Video streaming is one example.

具体的操作方法是: 我们在SDP的报文里面对RTP拓展做了声明

ini 复制代码
a=extmap:10 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay

这里事先约定了ID为10的RTP拓展头的报文为播放时延拓展头,后续为WebRTC的识别做出指导

然后通过WireShark的报文可以过滤看到RTP报文存在拓展头ID是10的标识,代表接入成功

yaml 复制代码
    Header extensions
        RFC 5285 Header Extension (One-Byte Header)
            Identifier: 8
            Length: 2
            Extension Data: a256
        RFC 5285 Header Extension (One-Byte Header)
            Identifier: 10
            Length: 3
            Extension Data: 000000

移除SR报文

这里面对接进来RTP拓展,并把时延设置为0ms, 我当时是没发现有什么作用的,后来看了文档里面有一段关键的话:

Also, for remote desktop without audio where rendering a frame asap makes sense

这对于没有音频的场景是有意义的,那么反过来说就是如果存在音频通道的场景,这个值就是无意义的

那么为什么存在音频就无法设置0ms的尽快交付播放呢?后来我查了资料,存在音视频同步的概念,也叫音画同步,为了控制音画同步,WebRTC采用控制音频和视频的Jitter buffer 的延迟,间接控制了播放延迟,从而达到音视频同步的效果,那么也就影响了我们上面的设置的播放延迟。

音视频同步相关的了解:zhuanlan.zhihu.com/p/346004563

这里面涉及他们怎么实现音视频同步的,我这里不额外展开,需要关注的是,WebRTC是通过SR报文里面音视频采集的时间戳来实现同步的,那么当时我这边考虑是否去除了SR报文就可以了,确实是这样的,去除之后,E2E的时延就降低下来了,办公室的网络环境在220ms左右,减去T1的时延,在140ms左右,算是一个玩王者荣耀都算可玩的状态,算是一个阶段性的优化了

编码方式调整

这里还没做,未验证可行性和兼容性,后面再填坑

相关推荐
福大大架构师每日一题19 小时前
mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升
网络协议·udp·webrtc
草根大哥3 天前
08-横向扩容与突发高并发:加机器到底买到了什么
运维·webrtc·srt·横向扩容·whip·自建cdn
音视频牛哥3 天前
人形机器人的未来发展趋势是什么?从VLA、实时视觉到规模化运营
机器学习·机器人·音视频开发
草根大哥3 天前
07-P2P 直连与节点池调度
webrtc·p2p·srt·whip·whep·自建cdn
草根大哥3 天前
06-可观测性:端到端延迟、稳定性与画质
webrtc·srt·whip·自建cdn·ppcdn
大文说跨境3 天前
用 Python 自动化检测浏览器环境指纹:WebRTC 泄露、Canvas 哈希与时区一致性校验
python·自动化·webrtc
霍营_托尼4 天前
纯前端播 40GB 本地视频?我把浏览器改造成了「磁盘流式」播放器
前端·javascript·音视频开发
EasyDSS4 天前
基于WebRTC的视频会议系统:私有化视频会议平台EasyDSS视频会议到底能干什么
音视频·webrtc·easydss
福大大架构师每日一题7 天前
RustDesk 1.5.0发布:WebRTC、HDR 色调映射、剪贴板同步与百余项修复全面汇总
webrtc
福大大架构师每日一题12 天前
webrtc-rs/webrtc v0.21.0发布:API 可扩展、异步集成、确定性时间、ICE 重启与 SCTP 全面修复
webrtc