• ExoPlayer添加Ffmpeg扩展实现软解功能


    一.准备环境

    有时候Exoplayer自带的解码器不支持一些特殊的格式或者编码,此时我们可以通过给Exoplayer添加Ffmpeg扩展实现软解来支持这些编码。

    工具版本

    1. 系统:Ubuntu 20.04.3 LTS。
    2. Exoplayer源码:r2.18.1版本。
    3. NDK环境版本:NDK r21。
    4. Cmaker版本:3.23.3。
    5. Ffmpeg版本:4.2.2。

    安装好编译环境

    1. 下载AndroidSdk并配置好环境,本文用的SDK版本为30。
    2. 下载Exoplayer2.18.1版本源码。
    3. 下载NDK r21 ,配置好环境。
    4. 下载CMake3.23.3版本,配置好环境。
    5. 下载ffmpeg4.2.2版本,配置好环境。

    二.编译FFmpeg源码

    1. 设置变量名为FFMPEG_MODULE_PATH的 shell 变量:
    cd "Exoplayer工程目录"
    FFMPEG_MODULE_PATH="$(pwd)/extensions/ffmpeg/src/main"
    
    • 1
    • 2
    1. 设置变量名为NDK_PATH的 shell 变量:
    NDK_PATH="NDK的安装目录"
    
    • 1
    1. 设置主机平台变量(Linux 使用linux-x86_64 对于Mac OS X 使用 darwin-x86_64 ):
    HOST_PLATFORM="linux-x86_64"
    
    • 1
    1. 设置FFMPEG_PATH的Shell变量:
    cd "Ffmpeg工程目录"
    FFMPEG_PATH="$(pwd)"
    
    • 1
    • 2
    1. 现在添加解码器,可以使用命令中的空格添加多个解码器。例如,我们现在将添加3个解码器:mp3,aac和ac3:
    ENABLED_DECODERS=(mp3 aac ac3)
    
    • 1

    有关可用解码器的详细信息以及它们支持的格式,请参阅支持的格式页面

    1. 在 FFmpeg 模块目录中添加指向 FFmpeg 源代码的链接:
    cd "${FFMPEG_MODULE_PATH}/jni" && \
    ln -s "$FFMPEG_PATH" ffmpeg
    
    • 1
    • 2

    如果报错file exists可以使用如下命令:

    cd "${FFMPEG_MODULE_PATH}/jni" && \
    ln -sf "$FFMPEG_PATH" ffmpeg
    
    • 1
    • 2
    1. 使用Ndk编译FFmpeg源码:
    cd "${FFMPEG_MODULE_PATH}/jni" && \
    ./build_ffmpeg.sh \
      "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ENABLED_DECODERS[@]}"
    
    • 1
    • 2
    • 3

    如果您需要为不同的体系结构构建脚本或者配置ffmpeg编译参数,则可以编辑构建脚本文件:build_ffmpeg.sh脚本,默认支持armeabi-v7a,arm64-v8a,x86,x86_64

    1. 等待build_ffmpeg.sh编译脚本,结束,可以在ExoPlayer/extensions/ffmpeg/src/main/jni/ffmpeg目录下面生成了android-libs目录。

    三.交叉编译JNI接口

    在完成上述步骤以后,我们编译好的源码并不能直接在Android系统上使用,因为还未进行过交叉编译。

    1. 使用如下命令交叉编译并生成 aar 文件:
    cd "Exoplayer工程目录"
    ./gradlew extension-ffmpeg:assembleRelease
    
    • 1
    • 2
    1. 生成成功后,可以在 ffmpeg 生成文件夹中获取 aar 并将其导入到项目中。
    /ExoPlayer/extensions/ffmpeg/buildout/output/aar
    
    • 1

    使用 gradle 将 aar 库导入到项目中。

    四.在自己的项目中使用编译好的aar

    1. 依赖之前编译好的aar:
    implementation files('libs/extension-ffmpeg-release.aar')
    
    • 1
    1. 新建FfmpegRenderersFactory,并打开这个扩展:
    class FfmpegRenderersFactory extends DefaultRenderersFactory {
    
        public FfmpegRenderersFactory(Context context) {
            super(context);
            setExtensionRendererMode(EXTENSION_RENDERER_MODE_PREFER);
        }
    
        @Override
        protected void buildAudioRenderers(Context context, int extensionRendererMode, MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, AudioSink audioSink, Handler eventHandler, AudioRendererEventListener eventListener, ArrayList out) {
            out.add(new FfmpegAudioRenderer());
            super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 播放器实例化:
    ExoPlayer.Builder(MyApp.instance.applicationContext,new FfmpegRenderersFactory())
    
    • 1
    1. 播放链接:
    val url = ""
    val mediaItem: MediaItem = MediaItem.fromUri(url)
    player.setMediaItem(mediaItem)
    player.prepare()
    player.play()
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    腾讯云tca认证要具备哪些能力?腾讯云tca认证适合那些人群
    五、3d场景的卡片展示的创建
    GODIVA论文阅读
    Structures
    基于JAVA医院住院部管理计算机毕业设计源码+系统+数据库+lw文档+部署
    docker-compose 配置
    [PAT-Advanced] A1054. The Dominant Color (20)
    从Multirepo到Monorepo 袋鼠云数栈前端研发效率提升探索之路
    全面解析:诺华Novartis医药公司社招SHL入职测评笔试题型及攻略指南
    数字 IC 验证(1)UVM 验证技术
  • 原文地址:https://blog.csdn.net/unreliable_narrator/article/details/126146182