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好啊!!!!

相关推荐
每次的天空20 分钟前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭1 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日2 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安2 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑2 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟6 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡7 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi007 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil9 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你9 小时前
Android View的绘制原理详解
android