media3 exoplayer 扩展解码库在这里 take it , please !

时间:2024-10-21 22:00:29

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_flacdecoder_opus 的解码能力。详情请参考:支持的格式页面

因此,实际上只需要编译并引用 decoder_vp9decoder_av1decoder_ffmpeg 这三个扩展库,就能获得官方提供的全部解码能力。

编译示例:FFmpeg 音频解码库

下面以 FFmpeg 音频解码库为例,介绍如何编译和使用扩展库。

Let’s start

  1. 克隆 Media3 项目

    git clone https://github.com/androidx/media.git
    
  2. 首先要把整个media3项目弄下来,还要准备Android ndk和sdk独立版就行了。

  3. 手动构建FFmpeg库,以便gradle可以在APK中捆绑FFmpeg二进制文件,设置以下shell变量:

cd "<path to project checkout>"
FFMPEG_MODULE_PATH="$(pwd)/libraries/decoder_ffmpeg/src/main"
  1. 下载安卓NDK并在shell变量中设置它的位置。这个构建配置已经在NDK r26b上测试过了(如果安卓_ABI小于21的话就是r23c)。
NDK_PATH="<path to Android NDK>"
  1. 设置主机平台(对于Mac OS X使用“darwin-x86_64”):
HOST_PLATFORM="linux-x86_64"
  1. 为本机代码设置ABI版本(通常等于minSdk,不得超过它):
ANDROID_ABI=21
  1. 获取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)"
  1. 将解码器配置为包括。参见支持的格式页面,了解可用解码器的详细信息以及它们支持的格式。 详细:支持的格式页面
ENABLED_DECODERS=(vorbis opus flac)

我编译已经包括了ffmpeg支持所有格式了啊!!

  1. 在FFmpeg模块中添加到FFmpeg源代码的链接jni目录。
cd "${FFMPEG_MODULE_PATH}/jni" && \
ln -s "$FFMPEG_PATH" ffmpeg
  1. 执行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