导语 | 快直播是对标准直播边缘进行WebRTC改造的一种低延迟直播产品方案,在低延迟的同时,完全兼容标准直播的推流、云端媒体处理能力,并具有CDN强大的分发能力。客户可以从现有的标准直播平滑地迁移到快直播上来,快速实现低迟时直播场景应用[1][2]。快直播接入方式主要有两种:第一种通过浏览器和H5接入标准WebRTC,第二种通过SDK接入升级扩展的WebRTC。一般WebRTC SDK包含全套拉流、解码、渲染等功能,而在传统标准直播的客户中,往往已经有一套播放器和相应的业务逻辑,如何基于现有播放器快速接入快直播低延迟播放能力,成为普遍的客户需求。本文基于使用广泛的具有代表性开源播放器ijkplayer,介绍接入快直播传输层SDK和相关低延迟播放优化。
快直播传输层SDK(libLebConnection)只包含了传输层协议模块,包含信令、建联、RTP、RTCP、NACK和FEC等,并通过前后端配合对传输质量进行优化,实现了较好的QoS/QoE性能[1][2]。主要功能包含AAC和OPUS音频拉流、H.264和H.265视频拉流、并支持视频B帧。同时简化了SDK接口,使用非常方便,如下图所示:
快直播传输层SDK输出是音视频裸数据,非常容易封装成demuxer集成到传统播放器中。下图给出了ijkplayer集成快直播传输层SDK的工作流程,集成工作主要分为两步,第一步将libLebConnection封装实现webrtc_demuxer,第二步根据业务要求实现低延迟播控逻辑。下面以Android arm64为例,介绍具体集成工作。
FFmpeg webrtc demuxer 只要按 FFmpeg 的 AVInputFormat 接口定义来实现ff_webrtc_demuxer,接口包括webrtc_probe,webrtc_read_header,webrtc_read_packet和webrtc_close。具体实现可以见我们SDK提供的webrtc_demuxer.c 源文件。
webrtc demuxer集成到ijkplayer有两种方式:
第一种 不改动FFmpeg,通过外部注册的方式集成。ijkplayer目前的FFmpeg是老版本的4.0,支持外部注册的方式注册第三方demuxer,我们可以不改动FFmpeg代码的情况下,使ijkplayer编译webrtc_demuxer.c源文件和链接libLebConnection库,在ff_ffplay.c使用快直播时注册ff_webrtc_demuxer。具体步骤如下:
1. 把头文件leb_conntion_api.h拷贝到ijkplayer/android/contrib/build/ffmpeg-arm64/output/include/下面,再把动态库文件libLebConnection_so.so拷贝到ijkplayer/android/contrib/build/ffmpeg-arm64/output/下面。
2. 修改 ijkplayer/android/ijkplayer/ijkplayer-arm64/src/main/jni/ffmpeg/Android.mk(ijkplayer项目中,此文件软连接到ijkplayer/android/ijkplayer/ijkplayer-armv7a/src/main/jni/ffmpeg/Android.mk)
3. 拷贝webrtc_demuxer.c放入到ijkplayer/ijkmedia/ijkplayer目录下。
4. 修改ijkplayer/ijkmedia/ijkplayer/Android.mk文件,添加webrtc_demuxer.c编译和libLebConnection链接
5. 修改ijkplayer/android/ijkplayer/ijkplayer-arm64/src/main/jni/Application.mk,APP_STL改为c++_shared,这是由于libLebConnection 依赖了 libc++_shared 动态库。
6. 修改ijkmedia/ijkplayer/ff_ffplay.c,添加播放快直播url打开逻辑,注册ff_webrtc_demuxer,并指定 ff_webrtc_demuxer 为 input format 。
第二种 新版本FFmpeg已经废弃外部注册demuxer,可以直接修改FFmpeg代码加入webrtc_demuxer到libavformat,编译webrtc_demuxer.c和链接libLebConnection_so.so。
1. 直接将webrtc_demuxer.c拷贝到FFmpeg/libavformat文件夹下,并修改libavformat/Makefile,加入webrtc_demuxer.o编译。
2. 修改libavformat/allformats.c,加入ff_webrtc_demuxer
3. 此时FFmpeg configure需要加入libLebConnection头文件和库的依赖的选项:
“--extra-cflags=-I/path/libLebConnection/include --extra-ldflags=-L/path/libLebConnection/lib/ --extra-libs='-lLebConnection_so -lc++_shared”
4. 修改ijkmedia/ijkplayer/ff_ffplay.c,添加播放快直播url逻辑,注册ff_webrtc_demuxer并指定为 input format 。同第一种方法的第5和6步。
在完成上面集成工作后,ijkplayer就能播放webrtc://开头的快直播url。在ijkplayer demo播放list中添加快直播url,如下图所示:
由于FFmpeg和ijkplayer有较大buffer缓冲,端到端的延迟依旧比较大,需要针对低延迟进行播控优化,优化分为两部分。
第一部分优化,修改ijkplayer配置,使其适合低延迟播放场景。
1. 直播场景时实时推流,可以开启无限制buffer,这样可以尽可能快的读取数据,避免出现网络拥塞恢复后延迟累积的情况。
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "infbuf", 1);
2. ijkplayer中的buffering逻辑不适合低延迟直播场景,可以关闭。快直播传输层SDK是基于webrtc增强的半可靠传输协议,在一般弱网(20%)下能保证音视频正常播放,极端弱网(50%丢包)场景下,也可以保证音频正常播放,视频低帧率播放。
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
3. 需要根据buffer水位调整播放速率,同时开启soundtouch对倍速播放下对PCM进行处理,实现变速不变调。ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER,"soundtouch", 1);
第二部分优化,需要实现根据buffer水位调整播放速率。
下面代码是一个简单的示例,原理就是
示例中目标高水位为500ms,目标低水位为200ms,实际可以根据业务的延迟要求设置具体阈值。
由于关闭了buffering,那如何来统计卡顿次数和卡顿时长呢。可以通过统计渲染刷新时间间隔来统计。当视频渲染时间间隔大于一定阈值,记一次卡顿次数,并累计进卡顿时长。
先通过OBS推流时间秒表页面,并进行低延迟编码设置:GOP设2秒,编码模式veryfast,Profile为baseline,并采用zerolatency降低编码延时。
ijkplayer目标buffer水位设置200~300ms,可以稳定流畅播放快直播流,对两端画面的比秒表时间间隔,端到端延迟稳定在800ms左右。当然我们的低延时播控优化示例只是抛砖引玉,客户可能需要在各自的业务场景下进行具体的优化适配。
快直播优异的低延迟性和弱网抗性能已经得到了广泛的认可。我们专门实现了快直播传输层SDK,不仅通过前后端配合优化实现了较好的传输质量,而且简化了使用接口,提升易用性,方便客户在各种场景下应用。本文以传统播放器ijkplayer为例,给出了详细快直播传输层SDK集成方法和播控优化示例,测试结果显示,jikplayer播放快直播,在端到端延迟在800ms下实现稳定流畅的播放。客户可以参考本示例,对原有播放器进行较小改动就可以实现低延迟播放能力。在当下低延迟直播互动潮流中,传统播放器可以借助快直播焕发新的生命力,更好的满足低延迟直播需求。
快直播官网地址:
https://cloud.tencent.com/product/leb
快直播传输层SDK支持Android、IOS、Windows三个终端平台,可以从这里获取:
https://github.com/tencentyun/libLebConnectionSDK
1. 快直播-基于WebRTC升级的低延时直播
https://cloud.tencent.com/developer/article/1760040
2. 腾讯云快直播——超低延迟直播技术方案及应用
https://cloud.tencent.com/developer/article/1736846
腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONETM 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并以 All in One SDK 的创新方式为客户服务。腾讯云音视频为全真互联网时代,提供坚实的数字化助力。