由于默认Exoplayer
不支持ac3
的音频格式,所有需要自己编译一下ffmpeg
的扩展库,支持一下所有的音频格式。下面就跟着步骤自己编译一下吧;
强调一下,如果下载或者拉取代码慢,请合理科学上网。
1.下载ubuntu镜像文件
我是下载的这个版本
2.安装Oracle VM VirtualBox虚拟机
没钱买Mac就只能靠安装虚拟机了~~
下载安装包www.virtualbox.org/wiki/Downlo...
正常安装就行全部默认,这里就不多介绍了,我的电脑安装VirtualBox
没有报错。
3.创建ubuntu虚拟机
打开是这样的,选中的"Linex"是我已经创建好的,读者第一次打开没有这个,忽略就好。
点击"新建"。或者点击左上角"控制"->"新建"也可以,按照我截图的填写参数
文件夹我就默认在C盘,有强迫症的可以试试其他盘,我没试过;
根据你电脑的配置自己分配一下内存和CPU;我是分配的8G内存和6个CPU ;选好后直接下一步不需要其他操作
给虚拟机分配存储,我是分配了50G;好像不能少于25G。下一步,各种分配的信息查看,没问题就点击完成
这样,就已经创建好了,点击"启动"。
上下键,选中这然后回车,等一会会出现Ununtu
的LOGO
,在稍等一会就会启动Ununtu安装步骤。
成功进入ubuntu
安装界面,选中"中文简体"
安装,下一步
键盘选汉文,下一步,联网选"使用有线连接"
下一步,不更新,跳过 ,一直下一步,直到
填写个人信息(这里建议都填一样的值,后面要用到,统一后面就直接用一个值),下一步,下一步,等待安装系统完成。
到这里就安装好了,是有点慢,立即重启。
重启好了,跳过引导,回到桌面;恭喜你成功安装好了ubuntu系统。
4.共享一个文件夹,可以和windows访问同一个文件夹。
点击 设备->共享文件夹 ->共享文件夹
选个文件夹作为共享的,按照图中勾选。
5.安装增强功能
点击这个光盘一样的,没有的话,点击上方"设备"->"开启增强功能".
打开命令行,空白处右键"在终端中打开" 这就是类似windows
的命令行。要在同级目录中,就是光盘那个同一级目录,可以看到有一个VBoxLinuxAdditions.run
的文件。
依次输入下面命令,
arduino
//安装
sudo bash VBoxLinuxAdditions.run
//重启
reboot
等待重启成功后在打开命令行输入,用户名是第三步输入的,建议读者填一样的那个地方
sudo adduser 当前用户名 vboxsf
顺便在打开复制:设备->共享粘贴板 -> 双向
打开就可以实现windows
和ubuntu
两个系统之间复制文本
重启
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目录下 ,如图所示
修改ffmpeg
的build.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好啊!!!!