最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程

ExoPlayer 是一个开源的 Android 媒体播放库,由 Google 开发和维护,用于替代 Android 系统自带的 MediaPlayer。它提供了更强大的功能、更好的性能和更高的灵活性,适用于各种复杂的媒体播放场景。所以被广泛用于各种播放器场景。

最近项目中也使用了Exoplayer进行歌曲播放,但遇到报错:

02-14 18:26:05.078  2194  3425 I ACodec  : codec does not support config operating rate (err -2147483648)                                                                                              
02-14 18:26:05.085  1958  3430 E SoftMP3 : mp3 decoder returned error 1                                                                                                                                
02-14 18:26:05.085  2194  3425 E ACodec  : [OMX.google.mp3.decoder] ERROR(0x80001001)                                                                                                                  
02-14 18:26:05.085  2194  3425 E ACodec  : signalError(omxError 0x80001001, internalError -2147483648)                                                                                                 
02-14 18:26:05.085  2194  3425 E MediaCodec: Codec reported err 0x80001001, actionCode 0, while in state 6                                                                                             
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer: Audio codec error                                                                                                                            
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:   java.lang.IllegalStateException                                                                                                            
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at android.media.MediaCodec.native_dequeueInputBuffer(Native Method)                                                                   
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at android.media.MediaCodec.dequeueInputBuffer(MediaCodec.java:2505)                                                                   
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at androidx.media3.exoplayer.mediacodec.SynchronousMediaCodecAdapter.dequeueInputBufferIndex(SynchronousMediaCodecAdapter.java:101)    
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.feedInputBuffer(MediaCodecRenderer.java:1224)                               
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at androidx.media3.exoplayer.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:818)                                         
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1047)                                         
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:522)                                       
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at android.os.Handler.dispatchMessage(Handler.java:98)                                                                                 
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at android.os.Looper.loop(Looper.java:154)                                                                                             
02-14 18:26:05.086  2194  2290 E MediaCodecAudioRenderer:       at android.os.HandlerThread.run(HandlerThread.java:61)                                                                                 
02-14 18:26:05.088  2194  2290 E ExoPlayerImplInternal: Playback error

android设备系统自带的mp3解码器报错[OMX.google.mp3.decoder],在不同的平台上测试结果都报一样的错, 硬解码不行那就只能想办法进行软解了。查资料得知Exoplayer是支持通过扩展FFmpeg进行音频软解码的,官方扩展模块说明文档为decoder_ffmpeg,那么接下来就是按照官方文档进行集成扩展了。

decoder_ffmpeg模块最终会被编译打包成aar文件供Android调用,由于依赖FFmpeg,先要下载FFmpeg源码进行编译得到所依赖的库才能成功打包aar。下面详细介绍整个流程:参考该文章ExoPlayer(AndroidX Media3) 扩展ffmpeg实现音频软解码

环境准备:
1.Ubuntu 20.04.4 LTS
2.AndroidNDK版本r26C
3.AndroidStudio 2023.1.1(配置好SDK和JDK 17.0.10)
4.ffmpeg6.0源码
5.ExoPlayer源码,AndroidX Media release分支版本

 由于一般都是在Windows上进行安卓开发,所以还需要先安装虚拟机,然后在虚拟机上安装Ubuntu,通过linux系统完成整个编译过程。

一、安装虚拟机

Wmware下载看这里WM秘钥

安装教程看这里WM安装教程

破解秘钥:

秘钥许可证
4A4RR-813DK-M81A9-4U35H-06KND

NZ4RR-FTK5H-H81C1-Q30QH-1V2LA

JU090-6039P-08409-8J0QH-2YR7F

4Y09U-AJK97-089Z0-A3054-83KLA

4C21U-2KK9Q-M8130-4V2QH-CF810

MC60H-DWHD5-H80U9-6V85M-8280D

ZA30U-DXF84-4850Q-UMMXZ-W6K8F

AC590-2XW97-48EFZ-TZPQE-MYHEA

YF39K-DLFE5-H856Z-6NWZE-XQ2XD

AC15R-FNZ16-H8DWQ-WFPNV-M28E2

CZ1J8-A0D82-489LZ-ZMZQT-P3KX6

YA11K-6YE8H-H89ZZ-EXM59-Y6AR0

 二、安装虚Ubuntu

参考Ubuntu下载安装教程 

Ubuntu与Windows共享文件夹和复制粘贴

三、下载Exoplayer和FFmpeg最新源码

目前官方已废弃Exopler2,代码已经迁移到AndroidX Media,下载完成设置FFMPEG_MODULE_PATH变量

在Ubuntu的File根目录创建Android/Project目录存放各种资源,根据自己实际放任意创建位置即可

打开ubuntu终端窗口,进入到上面新建的目录下:

cd Android/Project
git clone https://github.com/androidx/media
cd media && FFMPEG_MODULE_PATH="$(pwd)/libraries/decoder_ffmpeg/src/main"

 echo $FFMPEG_MODULE_PATH /home/xxx/Android/Project/media/libraries/decoder_ffmpeg/src/main

没有安装git的话根据提示进行安装即可。

四、下载NDK并配置NDK环境

1.官网下载NDK,根据官方说明,需要选择NDK版本ndk-linux-r26d.zip,虚拟机下载较慢,可在windows上先下好拷贝到虚拟机Ubuntu上,并解压到/Android/Project/目录下

2.下载完成后解压,设置NDK_PATH变量

cd Android/Project
unzip android-ndk-r26d-linux.zip
cd android-ndk-r26c && NDK_PATH="$(pwd)"

echo $NDK_PATH /home/xxx/Android/Project/android-ndk-r26d

3.在当前NDK目录下,执行设置编译环境指令

//设置编译平台Lunux为
HOST_PLATFORM="linux-x86_64"

//设置最小支持Android版本,通常为项目设置的minSDK版本,NDKr26最小支持SDK为21
ANDROID_ABI=21

 五、下载FFmpeg源码并配置环境变量

进入Android/Project目录进行ffmpeg源码下载,MediaX中的Exoplayer要求FFmpeg版本6.0

git clone git://source.ffmpeg.org/ffmpeg 
cd ffmpeg 
//拉取与最新Exoplayer匹配的版本
git checkout release/6.0 
//配置环境变量
FFMPEG_PATH="$(pwd)"

echo $FFMPEG_PATH /home/xxx/Android/Project/ffmpeg

六、配置所需要支持的音频解码器类型

ffmpeg所支持音频格式官方说明点击这里查看 

//在ffmpeg目录下执行
ENABLED_DECODERS=(aac ac3 mp3 flac)

七、Exoplayer源码关联FFmpeg源码

将ExoPlayer源码中ffmpeg模块jni与ffmpeg源码关联,关联成功后会在jni目录中生成一个快捷方式指向ffmpeg源码目录

//在ffmpeg目录下执行关联指令

cd "${FFMPEG_MODULE_PATH}/jni"
ln -s "$FFMPEG_PATH" ffmpeg 

八、编译FFmpeg

Exoplayer源码中已经帮我们配好了编译脚本build_ffmpeg.sh,执行即可,带上之前配置的环境变量

//在Exoplayer源码decoder_ffmpeg模块,jni目录下执行编译

./build_ffmpeg.sh \ "${FFMPEG_MODULE_PATH}" "${NDK_PATH}" "${HOST_PLATFORM}" "${ANDROID_ABI}" "${ENABLED_DECODERS[@]}"

编译过程可能报错,基本根据报错信息处理就可以了,我碰到的问题是关联的ffmpeg目录找不到,实际上是关联成功了的,脚本中直接把关联路径改成绝对路径就可以了,报错的位置如下:

 编译成功后,会在ffmepg目录下生成一个android-libs目录 

 里面有各个不同架构平台的库,默认生成的是.a静态库文件,android上要用动态so库文件,修改一下编译脚本重新编译即可:

结果如下:

 九、编译decoder_ffmpge模块打包成aar文件供android调用

进入到Exoplayer源码更目录执行编译打包指令

./gradlew lib-decoder-ffmpeg:assembleRelease

报错的话更近提示进行处理即可,大概率就是JDK和SDK没有安装或者环境没有配置对

Ubuntu安装android sdk教程

Ubuntu安装JDK教程

编译成功后会在\libraries\decoder_ffmpeg\buildout\outputs\aar\目录生成aar包 

十、Android项目中使用aar实现音频软解码 

复制生成的aar包到项目libs目录,修改app下的build.gradle文件,引用aar包
implementation(files("libs/extension-ffmpeg-release.aar"))
自定义DefaultRenderersFactory,构造ExoPlayer实例时传入,日志中有ffmpeg相关信息代表加载成功。

    public class PluginRenderFactory extends DefaultRenderersFactory {
        /**
         * @param context A {@link Context}.
         */
        public PluginRenderFactory(Context context) {
            super(context);
        }


        @Override
        protected void buildAudioRenderers(Context context, int extensionRendererMode, MediaCodecSelector mediaCodecSelector, boolean enableDecoderFallback, AudioSink audioSink, Handler eventHandler, AudioRendererEventListener eventListener, ArrayList<Renderer> out) {
            ffmpegAudioRenderer = new FfmpegAudioRenderer(eventHandler, eventListener, audioSink);
            out.add(ffmpegAudioRenderer);
            super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);
        }
    }


 mExoPlayer = new ExoPlayer.Builder(context, renderersFactory).build();

 Android中使用可能出现编译不通过问题,大概率是Android项目使用的各种编译环境版本与编译aar时使用的不一致,Exoplayer源码使用如下配置:

建议尽量使用相同配置 ,还有就是我Ubuntu配置的JDK是17.0.14版本,所以AndroidStudio编译也要使用 相同版本JDK

至此大功告成! 

下一篇介绍Exoplayer+FFmpeg实现K歌场景中的切换原伴唱功能K歌中单双音轨实现原伴唱

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/974920.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…

【操作系统】操作系统概述

操作系统概述 1.1 操作系统的概念1.1.1 操作系统定义——什么是OS&#xff1f;1.1.2 操作系统作用——OS有什么用&#xff1f;1.1.3 操作系统地位——计算机系统中&#xff0c;OS处于什么地位&#xff1f;1.1.4 为什么学操作系统&#xff1f; 1.2 操作系统的历史1.2.1 操作系统…

使用Dify将AI机器人嵌入到你的前端页面中及chrome的扩展应用

目录 1 博主有话说2 前提环境3 Dify创建个聊天助手应用4 将AI聊天机器人嵌入到html中5 将AI聊天机器人设置为chrome的扩展应用6 博主增语 1 博主有话说 那博主话不多说&#xff0c;先展示一下成果&#xff01; 这个界面是使用dify配置的一个“聊天助手”的应用&#xff0c;助…

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类&#xff0c;用于构建 API 视图。这些视图类可以分为以下几类&#xff1a; 1. 基础视图类 这些是 DRF 中最基础的视图类&#xff0c;通常用于实现自定义逻辑。 常用类 APIView&#xff1a; 最基本的视图类&#xff0c;所有其…

数据结构-图-找出星型图的中心节点

力扣题目&#xff1a;1791. 找出星型图的中心节点 - 力扣&#xff08;LeetCode&#xff09; 有一个无向的 星型 图&#xff0c;由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点&#xff0c;并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。 给你一个二维整数…

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

VScode C语言学习开发环境;运行提示“#Include错误,无法打开源文件stdio.h”

C/C环境配置 参考&#xff1a; VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09;_vscode配置c环境-CSDN博客 基本步骤 - 安装MinGW-W64&#xff0c;其包含 GCC 编译器&#xff1a;bin目录添加到环境变量&#xff1b;CMD 中输入gcc --version或where gcc验证…

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

(学习总结25)Linux工具:vim 编辑器 和 gcc/g++ 编译器

Linux工具&#xff1a;vim 编辑器 和 gcc/g 编译器 vim 编辑器在 Linux 命令行中执行 vimvim 命令模式光标操作相关命令文本或字符操作命令撤销操作命令查找操作 vim 插入模式vim 底行模式查找与编写操作界面操作文件处理操作vim 与 shell 交互其它操作退出 vim 一般操作 vim 可…

IntelliJ IDEA中Maven配置全指南

一、环境准备与基础配置 1.1 Windows 环境下载并配置 Maven 见此篇博文&#xff1a;环境配置 1.2 IDEA配置步骤 打开设置面板&#xff1a;File → Settings → Build → Build Tools → Maven 关键配置项&#xff1a; Maven home path E:\apache-maven-3.9.9 &#xff08;…

第4章 信息系统架构(三)

4.3 应用架构 应用架构的主要内容是规划出目标应用分层分域架构&#xff0c;根据业务架构规划目标应用域、应用组和目标应用组件&#xff0c;形成目标应用架构逻辑视图和系统视图。从功能视角出发&#xff0c;阐述应用组件各自及应用架构整体上&#xff0c;如何实现组织的高阶…

Ubuntu 20.04源码安装opencv 4.5.0

安装依赖项 sudo apt install -y g sudo apt install -y cmake sudo apt install -y make sudo apt install -y wget unzip安装opencv依赖库 sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev l…

前端如何转战鸿蒙

前端如何转战鸿蒙系统 在当今技术日新月异的时代&#xff0c;前端开发者们不断探索新的领域和机会。随着鸿蒙系统的崛起&#xff0c;一个全新的生态正等待着前端开发者们去开拓。那么&#xff0c;作为前端开发者&#xff0c;我们为何要转战鸿蒙系统&#xff1f;又该如何顺利转型…

Linux(ubuntu) GPU CUDA 构建Docker镜像

一、创建Dockerfile FROM ubuntu:20.04#非交互式&#xff0c;以快速运行自动化任务或脚本&#xff0c;无需图形界面 ENV DEBIAN_FRONTENDnoninteractive# 安装基础工具 RUN apt-get update && apt-get install -y \curl \wget \git \build-essential \software-proper…

新能源汽车核心元件揭秘:二极管、三极管结构与工作原理解析(2/2)

上一节我们讲了二极管的原理, 原文章: https://zhuanlan.zhihu.com/p/25252117833 看了的朋友应该很容易懂这节课 这篇文章我们来说说三极管的工作原理啊 这里要说下几个概念 1 半导体的导通, 就是说里面的负电荷电子和正电荷空穴可以大量的从 一个地方达到我们想要的地方…

2024年数学SCI1区TOP:改进海洋捕食者算法MMPA用于UAV路径规划,深度解析+性能实测

目录 1.摘要2.海洋捕食者算法MPA原理3.改进策略4.结果展示5.参考文献6.获取代码 1.摘要 本文提出了一种改进海洋捕食者算法&#xff08;MMPA&#xff09;&#xff0c;用于解决具有多重威胁的复杂环境中的全局优化问题&#xff0c;针对无人机&#xff08;UAV&#xff09;路径规…

QML ToolButton与DelayButton的使用、详解与自定义样式

QML MenuBarItem与MenuItem的使用、详解与自定义样式 一、介绍1、ToolButton常见用法基础示例设置图标 常用属性texticonenabledshortcutcheckable & checked 信号onClickedonPressed 和 onReleased 样式和外观使用场景 2、DelayButton使用场景核心属性1. delay 核心信号1.…

Linux下基本指令(4)

Linux权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制 普通用户&#xff1a;在linux下做有限的事情。 超级用户的命令提示符是“#”&#xff0c;普通用户…

网络安全设备防护原理 网络安全防护装置

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 防火墙 简介 网络层的防护设备&#xff0c;依照特殊的规则允许或者限制传输的数据通过 是由软件和硬件设备组合而成&#xff0c;在内部网和外部网之间、专用网…

windwos与linux环境下Iperf3带宽测试工具的安装、使用

目录 一、前言 二、windows 2.1下载 2.2安装 2.3使用 2.3.1服务端 2.3.2客户端 2.3.3输出内容 1.客户端 2.服务端 2.4.相关命令 三、linux 3.1安装 3.2使用 1.服务端 2.客户端 3.输出内容 1.客户端 2.服务端 一、前言 在数字化浪潮下&#xff0c;网络性能…