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相关信息代表加载成功,具体实现方法参考前面文章即可。

相关推荐
Lei活在当下3 小时前
【Perfetto从入门到精通】4.使用 heapprofd 工具采样追踪 Java/Native 内存分配
android·性能优化·架构
alexhilton4 小时前
学会在Jetpack Compose中加载Lottie动画资源
android·kotlin·android jetpack
daidaidaiyu5 小时前
FFmpeg 关键的结构体
c++·ffmpeg
summerkissyou19875 小时前
Android-Camera-为啥不移到packages/module
android·相机
liang_jy5 小时前
Android UID
android·面试
好游科技7 小时前
语聊APP新生态!一站式语聊房语音直播APP源码开发搭建
音视频·webrtc·im即时通讯·社交软件·社交语音视频软件
nono牛8 小时前
安卓/MTK平台日志关键词详解
android
TimeFine9 小时前
Android AI解放生产力(四)实战:解放绘制UI的繁琐工作
android
sheji34169 小时前
【开题答辩全过程】以 基于Android的社区车位共享管理系统的设计与实现为例,包含答辩的问题和答案
android
TimeFine9 小时前
Android AI解放生产力(三):认识custom_prompts和skills
android