技术解码 | 详解快直播传输层SDK的FFmpeg集成和编译

2022-01-04 10:10:24 浏览数 (1)

自从快直播传输层SDK发布以来,越来越多的客户通过快直播传输层SDK libLebConnection接入,其接入便捷性受到客户的肯定。libLebConnection和相应的WebRTC Demuxer实现了多个版本的迭代优化,主要有下面4点:

  1. 追求极致性能,提升首帧、开播成功率和卡顿等QoS指标。
  2. 提升SDK的易用性、稳定性和完备性。
  3. 打磨瘦身,SDK体积减少30%,实现ARM64打包增量不超过500K。
  4. 实现Android、iOS、Windows、Linux和Mac全终端平台覆盖。

前面我们已经在文章《基于ijkplayer的快直播传输层SDK应用实践》中简单介绍过如何在FFmpeg中集成libLebConnection,本文将详细展开介绍WebRTC Demuxer的实现,并给出在FFmpeg最新的4.4分支上给出配置和编译的全过程,让大家对libLebConnection使用有更加深入的理解,凭借FFmpeg强大的功能可以实现快直播的拉流、播放、媒体处理、转推等多种应用。

1. WebRTC Demuxer实现详解

进入正题,先介绍WebRTC Demuxer的实现。通过AVInputFormat接口定义WebRTC Demuxer的接口函数webrtc_probe、webrtc_read_header、webrtc_read_packet和webrtc_read_close。如下图所示。

下图中可以很清晰的看到WebRTC Demuxer在FFmpeg/libavformat和libLebConnection之间的关系和工作流程。WebRTC Demuxer是连接FFmpeg/libavformat和快直播传输层SDK libLebConnection的桥梁,绿色是FFmpeg avformat接口、紫色是WebRTC Demuxer接口、红色是libLebConnection接口。由于libLebConnection是内部驱动的工作模式(数据通过回调的方式输出),所以需要PacketQueue来连接libLebConnection、WebRTC Demuxer和FFmpeg/libavformat,所有libLebConnection回调输出的codec信息和codec数据都存放在PacketQueue,通过webrtc_read_packet读取和处理。

下面详细介绍FFmpeg框架下libLebConnection SDK工作流程。

第一步. avformat_open_input

在avformat_open_input时通过url格式的解析来确定输入协议格式,这时就需要webrtc_probe通过url的形式来判定是否为WebRTC协议,有两种url形式:

第一种是webrtc://开头的url;

第二种是http(s)://xxxx/xx.sdp。

第二步. avformat_find_stream_info

avformat_find_stream_info就是读取码流的头信息,找到音视频codec信息,用来创建相应的音视频stream。对应的WebRTC Demuxer接口函数就是webrtc_read_header,分下面几个步骤:

1. 配置libLebConnection参数,创建LebConnection handle, 并注册回调函数。

2. 开始连接,内部走信令流程,直接建联拉流。

3. 开始拉流后,先收到的码流头信息,包括音频codec type、采样率和声道数信息

还有视频codec type和extradata(即H264的sps pps)

由于libLebConnection在回调线程中无法创建 stream,需要先把音视频头信息保存到PacketQueue里。当FFmpeg主线程在读到音视频头信息包的时候来创建音视频stream。

到此,avformat_find_stream_info结束,找音视频头信息并创建了相应的音视频stream,这就是大家熟知的stream probe过程。

第三步. av_read_frame

音视频stream创建好后,就可以通过av_read_frame读取音视频包了。对应的WebRTC Demuxer接口函数就是webrtc_read_packet。libLebConnection是内部驱动模式,音视频数据通过回调函数OnAudioDataCallback和OnVideoDataCallback放入PacketQueue,再由webrtc_read_packet从PacketQueue中读取AVPacket数据和并由libavformat解析,最后通过av_read_frame读取。

av_read_frame读到音视频AVPacket数据后,就是FFmpeg通用的解码和媒体处理pipline了。

第四步. avformat_close_input

停止和关闭LebConnection,释放掉PacketQueue。 

2. FFmpeg配置和编译

下面开始讲如何将libLebConnection编译进FFmpeg,以Mac平台为例。

第一步. 准备好FFmpeg最新代码
  1. git clone https://github.com/FFmpeg/FFmpeg.git
  2. cd FFmpeg
  3. git checkout release/4.4
  4. git pull
第二步. 下载libLebConnectionSDK,解压最新SDK

目前最新版本是v1.0.3.1

  1. git clone https://github.com/tencentyun/libLebConnectionSDK
  2. cd libLebConnectionSDK
  3. unzip -d /mywork/libLebConnection libs/v1.0.3.1/libLebConnection_mac_v1.0.3_twebrtc082906bfc8_tffmpeg2d527017e1_2021-12-01-19-46.zip
第三步. 修改FFmpeg配置文件Configure和编译

修改配置支持--enable-libLebConnection参数,如下图:

执行配置

代码语言:javascript复制
./configure --enable-libLebConnection --enable-pic --enable-gpl --enable-nonfree  --disable-doc --extra-cflags=-I/mywork/libLebConnection/include/ --extra-ldflags=-L/mywork/libLebConnection/libs/x64/ --extra-libs='-lLebConnection_a -lc  '"

注意:Mac平台我们SDK是采用静态库的形式,Linux我们采用是的动态库的形式,需要配置动态库链接的位置

export LD_LIBRARY_PATH=/mywork/libLebConnection/libs/x64/:$LD_LIBRARY_PATH 或者直接把路径添加到/etc/ld.so.conf里

执行编译 make -j8 & make install

第四步. ffplay拉流播放测试

通过下面一个简单ffplay命令就可以执行拉流播放了。

ffplay webrtc://5664.liveplay.myzijiebao.com/live/5664_harchar1

通过ffplay --help | grep webrtc 可以查询到webrtc dexumer的所有option参数。

其中:

-webrtc_server_address可以指定域名和IP,在需要测试环境时经常用到。

-webrtc_dump_file开启音视频裸数据dump,用来排除问题非常方便。

-webrtc_min_delay可以指定CDN回退下发数据量,有效减少因开播回退数据多而导致的带宽峰值大和快进追帧问题。

下面验证下快直播的抗弱网性能,设置30%的丢包率,此时ping已经大概率timeout,标准直播的http flv已经无法开播,而快直播仍旧能快速起播和流畅播放。

4. 小结与展望

本文详细介绍了快直播传输层SDK libLebConnection的FFmpeg集成和编译,特别是通过WebRTC Demuxer的代码剖析详细讲解了libLebConnection的使用。用户也可以参照实现自己播放器的Demuxer。对比标准直播,快直播在延迟接近的情况下QoS指标远优于标准直播,而卡顿指标接近的情况下,延迟能低于标准直播90%以上。用户可以根据业务需求选择目标延迟,平衡卡顿和延迟,实现最佳的播放体验。所以,快直播能完全替代标准直播,提供更好的服务质量,满足更多直播场景需求。最后请大家关注github上libLebConnectionSDK项目。(https://github.com/tencentyun/libLebConnectionSDK)

一波新功能、新优化正在路上,敬请期待。

腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONE™ 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力。

0 人点赞