Exoplayer2源码编译FFmpeg拓展模块实现音频软解码

在前面文章最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程中介绍了最新版本的Exoplayer(androidx.Media3)编译FFmpeg模块的流程,有就是media3版本的explayer最低支持的sdk版本是21也就是Android5.x,但是市面上还是有很多IOT设备是很老的android4.4(sdk=19)的,需要兼容的话就只能使用Exoplayer2来实现播放功能。所以就需要在Exoplayer2源码基础上编译FFmpeg模块,基本流程跟之前编译Media3版本差不多,但有些差异和坑,这里记录一下。

一.源码区别:

这块我主要用的是Exoplayer2+FFMPEG4.3

exoplayer2的下载地址:https://github.com/google/ExoPlayer

exoplayer3的下载地址:https://github.com/androidx/media

ffmpeg下载地址:https://github.com/FFmpeg/FFmpeg/branches (这是分支地址,找到4.3下载(使用exoplayer3的话,建议用6.0版本或以上)

二.配置编译环境

主要就是下面这几个,具体设置方式参考前面文章即可。

【FFMPEG_MODULE_PATH】 :exoplayer源码中ffmpeg模块路径

【NDK_PATH】:ndk路径

【HOST_PLATFORM】:编译平台环境-x86

【ANDROID_ABI】:Android最低支持版本,这里设置19

【FFMPEG_PATH】:FFmpeg自身源码路径

【ENABLED_DECODERS】:需要支持的音频格式

三.编译FFmpeg源码

ffmpeg模块路径与media3中不一样,ExoPlayer-release-v2\extensions\ffmpeg

Exoplayer源码中已经帮我们配好了编译脚本build_ffmpeg.sh,执行即可,带上之前配置的环境变

复制代码
//在Exoplayer源码decoder_ffmpeg模块,jni目录下执行编译
 
./build_ffmpeg.sh \ "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ANDROID_ABI}" "${ENABLED_DECODERS[@]}"

量坑一:编译报错

编译链armv7a-linux-androideabi16-clang找不到,由于使用的ndk版本26较高,没有androideabi-16低版本了,修改编译脚本build_ffmpeg.sh对应位置为androideabi-21即可。

四.编译ffmpge扩展模块打包成aar文件供android调用

进入到Exoplayer源码更目录执行编译打包指令

复制代码
./gradlew extension-ffmpeg:assembleRelease

坑二:编译报错找不到Android SDK,或者NDK版本与前面编译ffmpeg时使用的不一致,导致各种错误

解决办法:在Exoplayer2源码项目跟目录增加sdk和ndk路径配置文件local.properties,注意需要根据自己放置sdk和ndk的目录位置配置

复制代码
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Thu Feb 20 11:36:04 CST 2025

#根据自己的目录修改
sdk.dir=/home/xxx/android-sdk 
ndk.dir=/home/xxx/android-ndk-r26d

五.Android项目中使用aar实现音频软解码

复制生成的aar包到项目libs目录,修改app下的build.gradle文件,引用aar包

implementation(files("libs/extension-ffmpeg-release.aar"))

自定义DefaultRenderersFactory,构造ExoPlayer实例时传入,日志中有ffmpeg相关信息代表加载成功,具体实现方法参考前面文章即可。

相关推荐
安卓与AI研习社1 小时前
Android ANR 到底怎么定位?从触发原理到日志判断的完整方法
android
杀生丸学AI3 小时前
【稀疏重建】StructSplat:基于非校准稀疏视图的可泛化3DGS
深度学习·3d·音视频·transformer·三维重建·空间智能
小柯南敲键盘3 小时前
跨境电商图片翻译工具推荐:批量AI翻译+视频字幕+智能抠图
人工智能·python·音视频
阿pin3 小时前
Android随笔-MVI
android·mvi
leobertlan3 小时前
【好玩系列】训练一个神经网络指导小孩玩游戏
android·机器学习·程序员
Android-Flutter4 小时前
android LeakCanary 工作原理 详解
android·kotlin
newcih4 小时前
从原理到实战:LSPosed 模块开发完全指南(2026 修订版)
android·xposed·lsposed
AFinalStone5 小时前
Android 7系统无障碍服务(一)全景图与架构概览
android·无障碍服务
Android-Flutter5 小时前
android 自定义view 详解
android·kotlin
DogDaoDao6 小时前
【H266/VVC提案解读】ITU-T H.274 (V4) 规范深度解读 — 视频编码 SEI 消息的全面演进
音视频·实时音视频·视频编解码·流媒体·h266·vvc·视频编解码标准