关于音视频:易开源-基于-ijkplayer-的-LLSPlayer-移动端应用实践

40次阅读

共计 2844 个字符,预计需要花费 8 分钟才能阅读完成。

云信低延时直播(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 webrtc
cd webrtc
fetch --nohooks webrtc_ios  // 拉取 WebRTC 代码
cd src
git 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

正文完
 0