当前位置:网站首页>ExoPlayer添加Ffmpeg扩展实现软解功能
ExoPlayer添加Ffmpeg扩展实现软解功能
2022-08-04 06:14:00 【PalmerYang】
一.准备环境
有时候Exoplayer自带的解码器不支持一些特殊的格式或者编码,此时我们可以通过给Exoplayer添加Ffmpeg扩展实现软解来支持这些编码。
工具版本
- 系统:Ubuntu 20.04.3 LTS。
- Exoplayer源码:r2.18.1版本。
- NDK环境版本:NDK r21。
- Cmaker版本:3.23.3。
- Ffmpeg版本:4.2.2。
安装好编译环境
- 下载AndroidSdk并配置好环境,本文用的SDK版本为30。
- 下载Exoplayer2.18.1版本源码。
- 下载NDK r21 ,配置好环境。
- 下载CMake3.23.3版本,配置好环境。
- 下载ffmpeg4.2.2版本,配置好环境。
二.编译FFmpeg源码
- 设置变量名为FFMPEG_MODULE_PATH的 shell 变量:
cd "Exoplayer工程目录"
FFMPEG_MODULE_PATH="$(pwd)/extensions/ffmpeg/src/main"
- 设置变量名为NDK_PATH的 shell 变量:
NDK_PATH="NDK的安装目录"
- 设置主机平台变量(Linux 使用linux-x86_64 对于Mac OS X 使用 darwin-x86_64 ):
HOST_PLATFORM="linux-x86_64"
- 设置FFMPEG_PATH的Shell变量:
cd "Ffmpeg工程目录"
FFMPEG_PATH="$(pwd)"
- 现在添加解码器,可以使用命令中的空格添加多个解码器。例如,我们现在将添加3个解码器:mp3,aac和ac3:
ENABLED_DECODERS=(mp3 aac ac3)
有关可用解码器的详细信息以及它们支持的格式,请参阅支持的格式页面。
- 在 FFmpeg 模块目录中添加指向 FFmpeg 源代码的链接:
cd "${FFMPEG_MODULE_PATH}/jni" && \
ln -s "$FFMPEG_PATH" ffmpeg
如果报错file exists可以使用如下命令:
cd "${FFMPEG_MODULE_PATH}/jni" && \
ln -sf "$FFMPEG_PATH" ffmpeg
- 使用Ndk编译FFmpeg源码:
cd "${FFMPEG_MODULE_PATH}/jni" && \
./build_ffmpeg.sh \
"${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}"
如果您需要为不同的体系结构构建脚本或者配置ffmpeg编译参数,则可以编辑构建脚本文件:build_ffmpeg.sh脚本,默认支持
armeabi-v7a,arm64-v8a,x86,x86_64
- 等待build_ffmpeg.sh编译脚本,结束,可以在
ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg目录下面生成了android-libs目录。
三.交叉编译JNI接口
在完成上述步骤以后,我们编译好的源码并不能直接在Android系统上使用,因为还未进行过交叉编译。
- 使用如下命令交叉编译并生成 aar 文件:
cd "Exoplayer工程目录"
./gradlew extension-ffmpeg:assembleRelease
- 生成成功后,可以在 ffmpeg 生成文件夹中获取 aar 并将其导入到项目中。
/ExoPlayer/extensions/ffmpeg/buildout/output/aar
使用 gradle 将 aar 库导入到项目中。
四.在自己的项目中使用编译好的aar
- 依赖之前编译好的aar:
implementation files('libs/extension-ffmpeg-release.aar')
- 新建FfmpegRenderersFactory,并打开这个扩展:
class FfmpegRenderersFactory extends DefaultRenderersFactory {
public FfmpegRenderersFactory(Context context) {
super(context);
setExtensionRendererMode(EXTENSION_RENDERER_MODE_PREFER);
}
@Override
protected void buildAudioRenderers(Context context, int extensionRendererMode, MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, AudioSink audioSink, Handler eventHandler, AudioRendererEventListener eventListener, ArrayList<Renderer> out) {
out.add(new FfmpegAudioRenderer());
super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);
}
}
- 播放器实例化:
ExoPlayer.Builder(MyApp.instance.applicationContext,new FfmpegRenderersFactory())
- 播放链接:
val url = ""
val mediaItem: MediaItem = MediaItem.fromUri(url)
player.setMediaItem(mediaItem)
player.prepare()
player.play()
边栏推荐
猜你喜欢
随机推荐
秒杀系统设计
Produce definition 产品与行业分析 勤于思考 善于总结 强于表达
MySQL(4)
花了近70美元入手的学生版MATLAB体验到底如何?
两日总结八
JVM 快速检测死锁
MySQL内存淘汰策略
SQL去重的三种方法汇总
Error occurred while trying to proxy request项目突然起不来了
如何用matlab做高精度计算?【第二辑】
两日总结四
软件稳定性思考
unicloud 腾讯云 上传文件 Have no access right to the storage uniapp
用matlab打造的摩斯电码加解码器音频版,支持包括中文在内的任意字符
LeetCode(剑指 Offer)- 18. 删除链表的节点
Base64编码原理
七夕送礼,心愿直抵!
科研绘图图表类型种类繁多,本文告诉你如何选择!
零分贝超静音无线鼠标!数量有限!!先到先得!!!【元旦专享】
Praat:语音标注工具【保存为TextGrid文件】







![(19)[系统调用]SSTD hook 阻止关闭](/img/73/e9d591af366db17965d0bf1cf192b7.png)

