当前位置:网站首页>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()
边栏推荐
- SQL去重的三种方法汇总
- 网页中常用的两种绘图技术,用canvas绘图,绘制出一个三角形,矩形,柱状图,扇形图
- Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
- Error ER_NOT_SUPPORTED_AUTH_MODE Client does not support authentication protocol requested by serv
- app逆向1某联
- [漏洞问题] log4j漏洞 关于2.17.0升级到2.18.0 方案
- Mac安装PHP开发环境
- 反序列化字符逃逸漏洞之
- 对象的扩展补充
- 西门子PLC1200与fanuc机器人进行profibus通讯
猜你喜欢
随机推荐
likeshop外卖点餐系统【100%开源无加密】
带你了解一下PHP搭建的电商商城系统
matlab科研绘图模板,直接奉上源代码!
错误记录:TypeError: object() takes no parameters
有趣的USB接口和颜色分类
JVM工具之 JPS
DOM的12中节点类型,通过关系或方法获取DOM节点,渲染到浏览器页面的一些特效功能,获取DOM节点来改变属性,点击图片,切换为所点击的图片为背景图,页面上的表单验证,点击底部导航栏切换界面
Database: Organize Four Practical SQL Server Scripting Functions
CSRF和SSRF漏洞
Database Skills: Organize SQL Server's Very Practical Scripts
Base64编码原理
SQL去重的三种方法汇总
SQL存储过程详解
mysql锁机制
类图规范总结
Microsoft computer butler 2.0 beta experience
【selenium自动化】第四篇,结合testNg
关于我写的循环遍历
Jenkins pipeline 自动部署实践
Detailed ResNet: What problem is ResNet solving?