android開發-Windows環境下編譯FFMPEG原始碼
1.簡介
之前有兩篇文章講到如何在windowsPC端使用FFMPEG命令列程式。
但是我想要在android開發時使用FFMPEG的功能又該怎麼辦?所以就需要編譯FFMPEG,然後才能使用。這才有了這篇文章。
1.先講思路,2.後講具體流程!
但是首先有個問題就是我的電腦是windows系統,如何編譯FFMPEG? 看網上的許多例子都是Linux和MAC系統。實在是看的我兩眼發萌。
幸好有解決辦法,那就是在Windows電腦上裝一個MinGW。因為WIndows沒有編譯環境,只有裝了這個(類似或CygWin)才有編譯環境,我們才能進行編譯。
MinGW是什麼?
- MinGW 是一組包含檔案和埠庫,其功能是允許控制檯模式的程式使用微軟的標準C執行時(C Runtime)庫。
- 允許你在Windows平臺生成本地的Windows程式而不需要第三方C執行時(C Runtime)庫。
- MSYS是MinGW的一個子系統,是一套執行在Windows上的bash,也就是執行在Win上的Linux Terminal [1]。其實就是在Win上使用Linux的命令列進行操作,可以代替cmd來使用。對一些GNU的開源軟體,MSYS可能是必需的,因為它們通常需要./configure然後make才能執行。我們將MSYS和MinGW配合使用就可以打造出一個Win下的GNU命令列終端和編譯系統。
- 下載安裝MinGW時,自動裡面會有MSYS。
有了編譯環境,是不是要有東西可以編譯,所以就需要下載FFMPEG原始碼。
有了原始碼,還不能直接編譯,因為編譯時要執行一個指令碼檔案,而這個指令碼檔案裡面有NDK的配置,所以我們還需要下載一個NDK。
所以我們總共需要下載的東西有:
接下來講具體流程,如何下載?如何安裝?如何配置環境變數,如何檢驗配置成功?最終到如何編譯使用?
2.NDK的配置
至於為什麼不從androidStudio直接下載NDK,怎麼說呢?我自己也測試過,總是有問題,少東西,最終導致編譯不成功,導致我之前放棄過要編譯FFMPEGE。後來迎難而上,終於編譯成功。一定要注意一些不為人知的小細節,不然,就算按著流程來也可能最終導致編譯失敗。你有福了,幸好看了我這篇文章,我將會告訴你不為人知的小細節,相信你一定可以編譯FFMPEG成功。
1.我下載ndk壓縮包到D盤的一個資料夾,並解壓縮了。
2.配置ndk環境變數path,在其中加入
;D:\NDK\android-ndk-r14b;
3.檢驗是否配置成功
在cmd命令列輸入 ndk-build ,出現如下情況,則表示配置成功。
3.MinGW下載安裝配置
1.下載
2.得到一個.exe檔案(不管你放在哪),點開,然後選擇安裝位置,我是安裝到了D盤的MinGW資料夾
3.選擇了安裝位置之後,需要選擇需要安裝的元件,如上圖,我全部勾選,然後執行安裝。
執行安裝點選左上角的installation,然後點選apply change
4.安裝之後資料夾中的情況:
5.配置環境變數path,在其中加入兩個路徑:
;D:\MinGW\bin;
D:\MinGW\msys\1.0\bin
6.檢驗配置是否成功?出現下圖,即表示配置成功。
7.在msys/1.0/ 有一個msys.bat 的檔案,待會下面編譯指令碼檔案時是開啟它,而不是cmd。
3.FFMPEG原始碼下載,及修改configure檔案,及建立build_android.sh指令碼檔案
1.我下載了ffmpeg原始碼壓縮包,並解壓到了一個資料夾。
2.進入ffmpeg原始碼資料夾,修改configure檔案:
# 原來的配置內容:
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'
#替換後的內容:
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
3.新建一個 build_android.sh 指令碼檔案 , 用於配置及編譯使用 (名字不唯一)
4. build_android.sh 指令碼檔案裡面的內容如下:你也可以百度有其它的內容,這個不唯一
#!/bin/bash
#自己修改對應的路徑,要配置到環境變數中去
NDK=D:/NDK/android-ndk-r14b
#android4.9 對應的SDK在20左右,所以你的platforms應該選擇小於20的,因為向前相容,大於20的會有問題
SYSROOT=$NDK/platforms/android-18/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
read -p "Press any key to continue."
5.開啟 msys.bat 而不是cmd.
進入到ffmpeg原始碼資料夾
然後輸入
$chmod 777 build_android.sh
等待一段時間,然後輸入
$make
等待兩段時間,然後輸入
$make install
6.編譯完成,會在ffmpeg原始碼資料夾中生成一個android檔案
其/android/arm/lib目錄下的so庫檔案就是能夠在Android上執行的so庫。
至此,編譯結束,得到了so庫,大功告成!
如果總是編譯失敗,不妨推倒重來,多吸取失敗經驗,一定會成功的!