Media3 ExoPlayer 扩展解码库介绍
请注意,本文讨论的是 Media3 ExoPlayer 而不是 Google ExoPlayer2。详细参考:Media3 ExoPlayer 迁移指南
文章最后提供了已经编译好的AAR文件,直接引用即可!!!
为什么选择 ExoPlayer
使用过 ExoPlayer 的开发者都会发现,相比原生 MediaPlayer,ExoPlayer 在使用体验上更加友好。这是因为 ExoPlayer 对状态的要求不像原生 MediaPlayer 那么严格,如果在不同状态下调用某些方法,原生 MediaPlayer 可能会导致崩溃。详细参考:Android MediaPlayer 正确使用姿势
支持的视频格式
尽管 ExoPlayer 在网络流支持方面表现优异,但在某些情况下,它支持的视频格式可能不如原生 MediaPlayer 多。原因是两者都使用了系统的解码库 MediaCodec
,但如果平台进行了某些定制,原生 MediaPlayer 的解封装能力可能会更强。
扩展解码能力
幸运的是,ExoPlayer 提供了扩展解码能力的功能,虽然实现起来相对复杂,需要自己编译扩展库。
官方已经提供的扩展库包括:
-
decoder_av1
(视频解码) -
decoder_ffmpeg
(音频解码) -
decoder_flac
(音频解码) -
decoder_midi
(音频相关,无需编译,直接引用) -
decoder_opus
(音频解码) -
decoder_vp9
(视频解码)
从上面可以看出,ffmpeg
已经包括了 decoder_flac
和 decoder_opus
的解码能力。详情请参考:支持的格式页面
因此,实际上只需要编译并引用 decoder_vp9
、decoder_av1
和 decoder_ffmpeg
这三个扩展库,就能获得官方提供的全部解码能力。
编译示例:FFmpeg 音频解码库
下面以 FFmpeg 音频解码库为例,介绍如何编译和使用扩展库。
Let’s start
-
克隆 Media3 项目
git clone https://github.com/androidx/media.git
-
首先要把整个media3项目弄下来,还要准备Android ndk和sdk独立版就行了。
-
手动构建FFmpeg库,以便gradle可以在APK中捆绑FFmpeg二进制文件,设置以下shell变量:
cd "<path to project checkout>"
FFMPEG_MODULE_PATH="$(pwd)/libraries/decoder_ffmpeg/src/main"
- 下载安卓NDK并在shell变量中设置它的位置。这个构建配置已经在NDK r26b上测试过了(如果安卓_ABI小于21的话就是r23c)。
NDK_PATH="<path to Android NDK>"
- 设置主机平台(对于Mac OS X使用“darwin-x86_64”):
HOST_PLATFORM="linux-x86_64"
- 为本机代码设置ABI版本(通常等于minSdk,不得超过它):
ANDROID_ABI=21
- 获取FFmpeg并检查一个适当的分支。我们不能保证与所有版本的FFmpeg兼容。我们目前推荐6.0版:
cd "<preferred location for ffmpeg>" && \
git clone git://source.ffmpeg.org/ffmpeg && \
cd ffmpeg && \
git checkout release/6.0 && \
FFMPEG_PATH="$(pwd)"
- 将解码器配置为包括。参见支持的格式页面,了解可用解码器的详细信息以及它们支持的格式。 详细:支持的格式页面
ENABLED_DECODERS=(vorbis opus flac)
我编译已经包括了ffmpeg支持所有格式了啊!!
- 在FFmpeg模块中添加到FFmpeg源代码的链接jni目录。
cd "${FFMPEG_MODULE_PATH}/jni" && \
ln -s "$FFMPEG_PATH" ffmpeg
- 执行build_ffmpeg.sh为构建FFmpegarmeabi-v7a, arm64-v8a, x86和x86_64。如果您需要为不同的体系结构构建,可以编辑该脚本:
cd "${FFMPEG_MODULE_PATH}/jni" && \
./build_ffmpeg.sh \
"${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ANDROID_ABI}" "${ENABLED_DECODERS[@]}"
编译完成后生成 AAR 包
编译完成后,可以使用 :assembleRelease
任务生成 AAR 包。
./gradlew :libraries:decoder_ffmpeg:assembleRelease
项目引用
项目中引用编译好的 AAR 包非常方便,因为 ExoPlayer 会通过反射自动加载扩展库,所以只需将 AAR 包加入项目即可。
编译好的扩展库下载地址
接下来是编译好的扩展库:
decoder_vp9
decoder_av1
decoder_ffmpeg
下载地址:https://download.****.net/download/mhhyoucom/89900256