之前嘗試過(guò)win10下利用MSYS2和MinGW-W64搭建交叉編譯環(huán)境來(lái)編譯FFmpeg源碼,結(jié)果失敗了。雖然網(wǎng)上有很多文章介紹如何通過(guò)這種方式進(jìn)行編譯,但是由于NDK版本(從r10到r19的都有)以及FFMPEG版本(多數(shù)為3.x,我用的是4.3)的不同,稍有不慎便會(huì)與成功失之交臂。最終還是決定在linux原生環(huán)境進(jìn)行編譯,但是又怕麻煩 不想安裝ubuntu和虛擬機(jī),于是便采取了Win10+wsl的編譯方式。
一、編譯環(huán)境搭建
編譯環(huán)境主要涉及以下幾個(gè)方面:
-
安裝WSL(Windows Subsystem for Linux)
WSL的安裝可以參考微軟官方文檔win10安裝WSL向?qū)?/a>,linux系統(tǒng)選擇 Ubuntu 20.04 LTS
,安裝過(guò)程文檔介紹的很詳細(xì),這里不再累述。需要注意的是只需要安裝WSL1即可,無(wú)需升級(jí)到WSL2(如果你的win10版本滿(mǎn)足要求可以升級(jí)到WSL2,我沒(méi)有嘗試)
-
獲取Android NDK(for linux)
Android NDK可以從Android開(kāi)發(fā)者官網(wǎng)下載,需要注意的是為了配合后面將要講到的編譯腳本使用,NDK版本要求至少要r19(r20,r21也可以,我使用的是r21, android-ndk-r21e-linux-x86_64.zip
))
-
獲取Android SDK(for linux)
下載android-sdk_r24.4.1-linux.tgz,解壓后放到wsl的一個(gè)目錄下如/mnt/d/AndroidSDK
-
獲取FFmpeg源碼
可以通過(guò)git clone的方式從git下載,也可以從官網(wǎng)直接下載。git clone的腳本如下:
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
-
獲取編譯腳本
git鏈接如下
https://github.com/Javernaut/ffmpeg-android-maker.git
下載完成之后,在根目錄建立一個(gè)sources文件夾,并將上一步中的ffmpeg源碼拷貝一份放到sources目錄下.
需要注意的是, 目錄中的文件不要在windows底下打開(kāi),否則有可能出現(xiàn)類(lèi)似bash: $’\r’: command not found這樣的錯(cuò)誤,這是由于linux下文件 編碼格式與windows有所不同造成的。
-
wsl中安裝make和gcc
apt-get install make
apt-get insatll gcc
如果安裝gcc過(guò)程中出現(xiàn)無(wú)法下載的情況可以先更新一下源
apt-get update
-
WSL中設(shè)置相關(guān)環(huán)境變量
編譯腳本要求設(shè)置2個(gè)環(huán)境變量用于指定Android SDK 和 Android NDK的存放路徑分別為
- ANDROID_SDK_HOME
- ANDROID_NDK_HOME
以root權(quán)限打開(kāi)/etc/bash.bashrc文件
sudo vim /etc/bash.bashrc
然后向文件中加入如下內(nèi)容:
#android sdk
export ANDROID_SDK_HOME=/mnt/d/ubuntu/android-sdk_r24.4.1-linux/android-sdk-linux
#android NDK
export ANDROID_NDK_HOME=/mnt/d/ubuntu/android-ndk-r21e
''=''后面的內(nèi)容為你的sdk和ndk 的真實(shí)路徑
完成之后通過(guò)source命令讓改動(dòng)生效
source /etc/bash.bashrc
至此,編譯環(huán)境以及完全搭建完成了,下面就可以開(kāi)始編譯了。
二、編譯
進(jìn)入到之前下載的編譯腳本目錄,然后執(zhí)行如下命令開(kāi)始編譯:
sudo ./ffmpeg-android-maker.sh
如果編譯沒(méi)有出錯(cuò)的話(huà),大約十分鐘作用編譯就可完成。
注意:編譯需要root權(quán)限,否則可能會(huì)出現(xiàn)缺少權(quán)限之類(lèi)的錯(cuò)誤。
編譯完成之后會(huì)在output目錄下生成lib和include2個(gè)文件夾,里面分別是對(duì)應(yīng)不同cpu架構(gòu)的so文件和.h文件


腳本默認(rèn)生成適配4種架構(gòu)的庫(kù)文件
- armeabi-v7a (with NEON)
- arm64-v8a
- x86
- x86_64
可以通過(guò)參數(shù)來(lái)指定特定的cpu架構(gòu)
./ffmpeg-android-maker.sh -abis=arm,arm64
./ffmpeg-android-maker.sh --target-abis=armeabi-v7a,x86
./ffmpeg-android-maker.sh -abis=armeabi-v7a,arm64-v8a,x86,x86_64
# Builds binaries for all 4 ABIs
./ffmpeg-android-maker.sh
默認(rèn)的編譯腳本生成的是全功能的ffmpeg的庫(kù),因此庫(kù)文件比較大,如果想減小庫(kù)的大小可以根據(jù)實(shí)際的需求來(lái)修改腳本文件,詳情可以參考 what-the-codec。