写点什么

“易 +”开源 | 基于 ijkplayer 的 LLS-Player 移动端应用实践

作者:网易云信
  • 2023-03-30
    浙江
  • 本文字数:2090 字

    阅读完需:约 7 分钟

“易+”开源 | 基于 ijkplayer 的 LLS-Player 移动端应用实践

云信低延时直播(Low-Latency Streaming,LLS)是在网易云信标准直播的基础上,依托自研的全球实时传输网 WE-CAN 推出的低延时直播产品方案。在保障低延时的同时,具有极致秒开,低卡顿的特性。同时兼容标准直播的推流和云端媒体处理能力,方便客户从标准直播迁移到低延时直播上来。

云信低延时播放器 LLS-Player 是一个传输层的 SDK,基于 WebRTC 进行开发,包含信令和媒体建联,音视频数据接收,弱网对抗等能力,具有较好的 QoS 性能。继开源了 Windows 端后,我们陆续支持了移动端的能力,本文主要基于开源播放器 ijkplayer,介绍 LLS-Player 移动端的接入和优化实践。


LLS-Player 下载

LLS-Player 基于 WebRTC M94 版本进行开发,代码包含 WebRTC 的 patch 代码以及其他的源码文件。需要先下载 WebRTC 原生代码,然后下载网易云信的低延时直播代码 LLS-Player,最后将 LLS-Player 代码覆盖到 WebRTC 原生代码中。


下载 WebRTC M94 源码 

WebRTC 对应的代码分支和 commitId 如下,根据下面的步骤操作即可下载对应的源码。


// 以iOS为例mkdir webrtccd webrtcfetch --nohooks webrtc_ios  // 拉取WebRTC代码cd srcgit checkout -b m94 branch-heads/4606  // 此处基于4606创建m94分支。git reset --hard  b83487f08ff836437715b488f73416215e5570dd  // 重置到我们使用的版本。gclient sync
复制代码


下载 LLS-Player 源码


git clone https://github.com/GrowthEase/LLS-Player.git
复制代码


代码下载后,将 LLS-Player/src 目录下所有文件覆盖到上面下载的 WebRTC M94 版本中。


代码编译

Mac 打开 Shell,切换到 src 目录,执行如下命令:


// 编译iOS版本./build_ios.sh --allarch copy
// 编译android版本,例如arm64-v8a架构./build_android.sh arm64 --enable-shared
复制代码


编译完成后,iOS 在 src/rtd/project/ios/out/ 目录下会生成动态库 rtd.framework 和静态库 librtd.a;android 在 src/out/andorid_arm64 目录下会生成动态库 librtd.so 和对应的 libc++_shared.so。


LLS-Player 集成


LLS-Player 输出的视频格式为 H264,音频格式为 PCM。基于 FFMPEG 开发的播放器集成 LLS-Player 和封装的 rtddemuxer,通过 FFMPEG 原生的接口,就可以实现低延时的播放逻辑。下面以 ijkplayer 为例,介绍集成 LLS-Player 的流程。


 Android 端集成 


导入动态库和头文件


将动态库和头文件拷贝到指定的库目录下

  • 将 librtd.so 放入对应架构的路径中:

ijkplayer/android/contrib/build/ffmpeg-$arch/output


  • 头文件 nertd_api.h 和 rtd_def.h 放入对应架构的路径中 :

ijkplayer/android/contrib/build/ffmpeg-$arch/output/include


修改编译脚本

修改  

android/ijkplayer/ijkplayer-$arch/src/main/jni/ffmpeg/Android.mk  文件,如下图所示:



添加 rtd_dec.c 和动态库依赖

将 rtd_dec.c 文件拷贝到工程的源码目录下参与编译,例如 ijkplayer 中放到 ijkavformat 目录下。修改 ijkplayer/ijkmedia/ijkplayer/Android.mk 文件。



iOS 端集成 


导入动态库和头文件


  • 将 rtd.framework 或者 librtd.a 放入 ijkplayer/ios/build/universal/lib 目录下。

  • 头文件 nertd_api.h 和 rtd_def.h 放入 ijkplayer/ios/build/universal/include 目录下


添加 rtd_dec.c 和库文件


将 rtd_dec.c 文件拷贝到工程的源码目录下参与编译,例如 ijkplayer 中放到 ijkavformat 目录下。以 rtd.framework 为例,库文件的依赖如下图所示:



ijkplayer 修改


在 ff_ffplay.c 中添加低延时拉流的逻辑:

  • 包含头文件和必要的变量声明


#include "rtd_api.h" // 设置好头文件路径即可
extern AVInputFormat ff_rtd_demuxer;
复制代码


  • 注册低延时拉流协议


在 read_thread() 函数里,从 url 中区分出低延时拉流协议头,例如("nertc"),设置 AVInputFormat 为 ff_rtd_demuxer。

以上都需要在 avformat_open_input() 之前设置,avformat_open_input() 最后一个参数需要设置 options。



if (strncmp(is->filename, "nertc://", 8) == 0) { // 设置AVInputFormat 为ff_rtd_demuxer is->iformat = &ff_rtd_demuxer;}
// 上述代码在avformat_open_input前err = avformat_open_input(&ic, is->filename, is->iformat, &ffp->format_opts);
复制代码


编译播放器


上述设置完成后需要重新编译播放器工程。

android 端执行如下脚本:


./compile-ijk.sh all
复制代码


iOS 端打开工程,直接编译即可。


播放优化


完成上述设置后,输入 nertc:// 开头的拉流地址,就可以体验低延时直播。



LLS-Player 回调的是 H264 和 PCM 数据,由于 LLS-Player 中的视频 jitterBuffer 和音频 NetEQ 中有音视频包的缓存和追帧逻辑,能够保持低延时和流畅性之间的平衡。因此,播放器层的缓冲区水位可以尽量的小,达到极致低延时的效果。


下图是 LLS-Player 端到端延时的效果展示,LLS-Player 的 jitterBuffer 大小设置成 200ms,播放器层的 buffer 水位为 0,采用 OBS 推流,可以看到端到端延时在 550ms 左右。当然不同的业务场景下对延时的要求不太一样,可以根据实际情况进行调整。



网易智企【易+】开源计划已正式发布网易云信低延时直播方案。

查看网易云信低延时播放器源代码:

https://github.com/GrowthEase/LLS-Player

https://gitee.com/GrowthEase/lls-player

发布于: 刚刚阅读数: 5
用户头像

网易云信

关注

还未添加个人签名 2021-03-12 加入

来自网易云信,专注音视频技术,全面负责网易实时音视频、互动白板、直播、互动直播、传输网等项目的架构设计与研发,对音视频、高性能服务器以及网络通讯等领域均有多年的工作与项目经验 。

评论

发布
暂无评论
“易+”开源 | 基于 ijkplayer 的 LLS-Player 移动端应用实践_开源_网易云信_InfoQ写作社区