当前位置:网站首页>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()
边栏推荐
猜你喜欢
MySQL面试题大全(陆续更新)
详解CAN总线:常用CAN连接器的使用方法
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法
Detailed ResNet: What problem is ResNet solving?
科研绘图图表类型种类繁多,本文告诉你如何选择!
Online public account article content to audio file practical gadget
IDEA中创建编写JSP
unicloud 腾讯云 上传文件 Have no access right to the storage uniapp
七夕送礼,心愿直抵!
Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv
随机推荐
matlab封闭曲线拟合 (针对一些列离散点)
【愚公系列】2022年07月 Go教学课程 027-深拷贝和浅拷贝
E-R图总结规范
MySQL内存淘汰策略
用matlab打造的摩斯电码加解码器音频版,支持包括中文在内的任意字符
异步编程之promise,任务队列,事件循环
Amazon亚马逊 Vendor Central Label详解
pycharm专业版使用
MATLAB版量化交易技术分析工具TA-Lib【不付费也可获取,不要被付费吓跑】
LeetCode(剑指 Offer)- 18. 删除链表的节点
Promise.all 使用方法
TypeScript基本类型、类、封装、继承、泛型、接口、命名空间
有人试过用NPGsql驱动连接openGauss开发应用的吗?
Verilog“七宗罪”
原型图总结规范
MySQL基础(DDL、DML、DQL)
FCN - the originator of semantic segmentation (based on tf-Kersa reproduction code)
“需求370解决解决爬取章节之后主题讨论评论消失问题”工作总结
IDEA 控制台 中文乱码问题(如果网上教程都无法解决你的问题的话)
MySQL配置文件配置