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

相关推荐
雨白2 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk2 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING3 小时前
RN容器启动优化实践
android·react native
恋猫de小郭5 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker10 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴10 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭21 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos