Windows11平台编译exoplayer ffmpeg扩展库

由于默认Exoplayer不支持ac3的音频格式,所有需要自己编译一下ffmpeg的扩展库,支持一下所有的音频格式。下面就跟着步骤自己编译一下吧;

强调一下,如果下载或者拉取代码慢,请合理科学上网。

1.下载ubuntu镜像文件

ubuntu.com/download/de...

我是下载的这个版本

2.安装Oracle VM VirtualBox虚拟机

没钱买Mac就只能靠安装虚拟机了~~

下载安装包www.virtualbox.org/wiki/Downlo...

正常安装就行全部默认,这里就不多介绍了,我的电脑安装VirtualBox没有报错。

3.创建ubuntu虚拟机

打开是这样的,选中的"Linex"是我已经创建好的,读者第一次打开没有这个,忽略就好。

点击"新建"。或者点击左上角"控制"->"新建"也可以,按照我截图的填写参数

文件夹我就默认在C盘,有强迫症的可以试试其他盘,我没试过;

根据你电脑的配置自己分配一下内存和CPU;我是分配的8G内存和6个CPU ;选好后直接下一步不需要其他操作

给虚拟机分配存储,我是分配了50G;好像不能少于25G。下一步,各种分配的信息查看,没问题就点击完成

这样,就已经创建好了,点击"启动"。

上下键,选中这然后回车,等一会会出现UnuntuLOGO,在稍等一会就会启动Ununtu安装步骤。

成功进入ubuntu安装界面,选中"中文简体"

安装,下一步

键盘选汉文,下一步,联网选"使用有线连接"

下一步,不更新,跳过 ,一直下一步,直到

填写个人信息(这里建议都填一样的值,后面要用到,统一后面就直接用一个值),下一步,下一步,等待安装系统完成。

到这里就安装好了,是有点慢,立即重启。

重启好了,跳过引导,回到桌面;恭喜你成功安装好了ubuntu系统。

4.共享一个文件夹,可以和windows访问同一个文件夹。

点击 设备->共享文件夹 ->共享文件夹

选个文件夹作为共享的,按照图中勾选。

5.安装增强功能

点击这个光盘一样的,没有的话,点击上方"设备"->"开启增强功能".

打开命令行,空白处右键"在终端中打开" 这就是类似windows的命令行。要在同级目录中,就是光盘那个同一级目录,可以看到有一个VBoxLinuxAdditions.run的文件。

依次输入下面命令,

arduino 复制代码
//安装
sudo bash VBoxLinuxAdditions.run
//重启
reboot

等待重启成功后在打开命令行输入,用户名是第三步输入的,建议读者填一样的那个地方

sudo adduser 当前用户名 vboxsf

顺便在打开复制:设备->共享粘贴板 -> 双向

打开就可以实现windowsubuntu两个系统之间复制文本

重启

reboot

之后就可以访问共享目录了。

6.安装git

新建个文件夹,后续的命令都在此文件夹运行,打开命令行,依次执行

arduino 复制代码
//1.
sudo apt-update
//2.
sudo apt-get install git

7.下载ffmpeg库

bash 复制代码
git clone git://source.ffmpeg.org/ffmpeg
cd ffmpeg
git checkout release/4.2

拉取ffmpeg库,速度慢请科学上网,

8.拉取exoplayer

bash 复制代码
git clone https://github.com/google/ExoPlayer.git

9.下载NDK

一定要去官网下载:github.com/android/ndk...

ubuntu要选这个,可以用windos下载到共享目录;下载好了解压。我是把 第7,8,9步骤的文件全部放在了一个文件夹中。

10.准备工作好了,正式开始编译了

下载这个脚本,并将他放入到ffmpeg根目录;可以用windos下载,放到共享目录,在复制; github.com/caobin82165...

打开build_ffmpeg.sh脚本,需要改几个地方;这里编译了所有的Android Abi,其他的不懂就不要改了,我也不是很懂,复制的

用下面方式可以复制绝对路径

改好了后直接在ffmpeg目录运行该脚本

bash 复制代码
./build_ffmpeg.sh

等待运行完,没有报错那么恭喜你编译好了,在ffmpeg同级目录多了一个 android-libs文件夹,然后将这个目录全部拷贝到共享目录

可以看到编译了所有的平台

11.开始编译 ffmpeg.aar

到这步后就不需要虚拟机了,可以关掉了。

windows平台也将exoplayer代码拉下来。还是Mac好啊,不用这么麻烦。

打开exo项目目录,根据自己的存放位置,找到下面jni目录

makefile 复制代码
D:\2\ExoPlayer\ExoPlayer\extensions\ffmpeg\src\main\jni

在此目录打开命令行执行

bash 复制代码
git clone git://source.ffmpeg.org/ffmpeg
cd ffmpeg
git checkout release/4.2

在将共享目录中的 android-libs拷贝到ffmpeg目录下 ,如图所示

修改ffmpegbuild.gradle按照你的需求

修改CMakeLists

因为ubuntu编译出来的是so所以这里要用动态库,还有就是cmake我没有3.21.0,我就用了3.22.1

同步一下然后

等待编译,成功后会生成aar

到此,基本上就结束了,成功编译了扩展库。

12.给exo添加扩展

引入aar,不会的话百度。

创建FfmpegRenderersFactory

scala 复制代码
import android.content.Context;  
import android.os.Handler;  
  
import com.google.android.exoplayer2.DefaultRenderersFactory;  
import com.google.android.exoplayer2.Renderer;  
import com.google.android.exoplayer2.audio.AudioRendererEventListener;  
import com.google.android.exoplayer2.audio.AudioSink;  
//这里的导的就是aar中的类
import com.google.android.exoplayer2.ext.ffmpeg.FfmpegAudioRenderer;  
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;  
  
import java.util.ArrayList;  
  
public 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<Renderer> out) {  
//关键代码
out.add(new FfmpegAudioRenderer());  
super.buildAudioRenderers(context, extensionRendererMode, mediaCodecSelector, enableDecoderFallback, audioSink, eventHandler, eventListener, out);  
  
}  
}

根据自己的代码,将DefaultRenderersFactory替换成FfmpegRenderersFactory

clean重新打包测试下,ok, 基本到这里就结束了。

编译好的so和aar需要的自取:github.com/caobin82165...

第11步的完整项目:github.com/caobin82165...

13.总结

全程耗费一天时间,晚上还加班到9点,期间踩了无数坑,最难的就是卡在了动态库那里,google源码中使用的是STATIC静态库,而ubuntu编译出来的是so,卡了好久,最终在前同事大佬的指点下,终于编译出来了。

博客是第二天写的,可能存在哪一步会报错,想不起来了,如果读者自己尝试编译整个流程的时候哪一步报错可以留言,我遇到相同问题会有影响的,可以给你说解决办法。

最后还是吐槽一下,还是Mac好啊!!!!

相关推荐
图王大胜24 分钟前
Android SystemUI组件(11)SystemUIVisibility解读
android·framework·systemui·visibility
服装学院的IT男4 小时前
【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-2
android
Arms2064 小时前
android 全面屏最底部栏沉浸式
android
服装学院的IT男4 小时前
【Android 源码分析】Activity生命周期之onStop-1
android
ChinaDragonDreamer7 小时前
Kotlin:2.0.20 的新特性
android·开发语言·kotlin
网络研究院9 小时前
Android 安卓内存安全漏洞数量大幅下降的原因
android·安全·编程·安卓·内存·漏洞·技术
凉亭下9 小时前
android navigation 用法详细使用
android
小比卡丘12 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
前行的小黑炭13 小时前
一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发
android
落落落sss14 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis