ffmpeg編譯for android

搭建環(huán)境

a食听、一般情況下用linux環(huán)境最直接胸蛛,如果不想在多臺電腦操作,可以安裝兩個操作系統(tǒng)樱报,然后進(jìn)入系統(tǒng)引導(dǎo)的時候葬项,選擇不一樣的系統(tǒng)引導(dǎo)進(jìn)去相應(yīng)的系統(tǒng)。
這種情況要注意的是迹蛤,在linux下民珍,其他硬盤的掛載路徑是在/media/user/盤符/,是掛載到media下面的
b、安裝虛擬機(jī)盗飒,如果內(nèi)存足夠大嚷量,安裝一個vmware 14破解版的,分配4g足夠了逆趣,虛擬的機(jī)的好處是跟你現(xiàn)有window同時一起玩玩耍蝶溶,注意點(diǎn)就是開啟虛擬機(jī)和系統(tǒng)的文件的共享。其共享路徑是在/mnt/hgfs/下
具體共享方法可以借鑒這個:https://www.cnblogs.com/huangjianxin/p/6343881.html
c.另外一種就是在window上安裝MinGW+msys搭建編譯環(huán)境宣渗,如果想編譯window下的ffmpeg.exe抖所,以及dll這些動態(tài)庫,可以采用c方法
d.采用cygwin的搭建模擬環(huán)境落包,不過這個需要更新下載一大堆的包數(shù)據(jù)部蛇。

f.win10 子系統(tǒng)
先開啟window的子系統(tǒng)空能


218141751249.png

成功后重啟,然后再microsoft store 商店中下載lilnux


image.png

下載完成后會提示你設(shè)置用戶名和密碼咐蝇,然后這樣就成功了
最后如果想進(jìn)入子系統(tǒng)涯鲁,直接在cmd下輸入bash,便可直接進(jìn)入子系統(tǒng)了有序,非常方便抹腿,最開始的時候,需要安裝gcc環(huán)境 sudo apt-get install gcc
綜上旭寿,最方便的方式警绩,就是window開始子系統(tǒng)的功能了。

編譯

在window子系統(tǒng)下編譯
1盅称、先下載ffmpeg肩祥,然后改configuratoin后室,使得支持android so包的格式:

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)'

編譯的整體流程是三個步驟,第一是./configuration混狠,然后是make岸霹,然后make install,make install的時候前面加一個sudo即 sudo make install将饺,開始編譯的時候贡避,盡量是三個步驟分開,
然后成功了再放在一起予弧。應(yīng)該是在android平臺上的so包刮吧,所以采用ndk的來進(jìn)行混編,而且ndk采用的是linux版本的ndk

②編寫ffmpeg_android_configuration.sh指令:

# 設(shè)置NDK路徑
NDK=NDK=D:/IdeSDK/androidSdk/ndk-bundle/android-ndk-r16b
# 當(dāng)前設(shè)置為最低支持android-14版本掖蛤,arm架構(gòu)
SYSROOT=$NDK/platforms/android-14/arch-arm/
# 設(shè)置編譯工具鏈杀捻,4.9為版本號
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--prefix=$PREFIX \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=$CPU \
--sysroot=$SYSROOT \
$ADDITIONAL_CONFIGURE_FLAG
}
# 設(shè)置編譯后的文件輸出目錄
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
build_one

執(zhí)行完畢之后,會有這一下三個文件了:config.h,config.log,config.mak
之后再分別執(zhí)行坠七,make水醋,之后在執(zhí)行make install 指令

最后旗笔,編譯成功之后會在android文件夾下生成相應(yīng)的文件的彪置,如果要編譯成一個包,可以添加一下代碼

$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$SYSROOT/usr/lib \
-L$SYSROOT/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
    libavcodec/libavcodec.a \
    libavfilter/libavfilter.a \
    libswresample/libswresample.a \
    libavformat/libavformat.a \
    libavutil/libavutil.a \
    libswscale/libswscale.a \
    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
    $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

同時生成靜態(tài)庫:
--disable-static
--enable-shared
修改為:
--enable-static
--disable-shared
設(shè)置編譯器的路徑蝇恶,根據(jù)實際路徑進(jìn)行修改拳魁,編譯前一定要檢查一遍路徑是否正確!

最后組中的sh文件應(yīng)該是這樣

#!/bin/bash
# 設(shè)置NDK路徑
NDK=NDK=D:/IdeSDK/androidSdk/ndk-bundle/android-ndk-r16b
# 當(dāng)前設(shè)置為最低支持android-14版本撮弧,arm架構(gòu)
SYSROOT=$NDK/platforms/android-14/arch-arm/
# 設(shè)置編譯工具鏈潘懊,4.9為版本號TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--prefix=$PREFIX \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=$CPU \
--sysroot=$SYSROOT \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make 
make install
}
# 設(shè)置編譯后的文件輸出目錄
CPU=armv7-a
PREFIX=$(pwd)/android/$CPU
build_one

$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$SYSROOT/usr/lib \
-L$SYSROOT/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
    libavcodec/libavcodec.a \
    libavfilter/libavfilter.a \
    libswresample/libswresample.a \
    libavformat/libavformat.a \
    libavutil/libavutil.a \
    libswscale/libswscale.a \
    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
    $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

執(zhí)行腳本的時候前面加上sudo,即 sudo ./build_ffmepg.sh贿衍,有時候因為make install 的原因需要超級權(quán)限授舟。另外修改了configure配置之后,
建議從新單獨(dú)跑一下./configure(ffmpeg_android_configuration.sh) 而不是直接跑./build_ffmepg.sh贸辈,因為有時候configure會出錯的释树,沒有重新
生成config.mk配置文件,但是依然執(zhí)行了make擎淤, make install 的過程奢啥,到時生成的so還是一樣的舊結(jié)果。

所以非常建議嘴拢,改了配置之后桩盲,吧android 下的文件夾下先刪除,然后單獨(dú)跑ffmpeg_android_configuration.sh測試是否成功席吴。

so瘦身

完整的so包接近100M了赌结,很巨大捞蛋,所以是需要什么的功能開放功能,按需裁剪就好了柬姚,裁剪的時候關(guān)注兩個地方襟交,第一個是./configure 成功之后,會
在bash下顯示編譯的結(jié)果伤靠,上面提示ffmpeg有哪些結(jié)果會輸出:

另外一個是看config.mak里面捣域,可以看到有哪些配置項是打開和關(guān)閉的狀態(tài)。
正常來說宴合,我們只需要把主要用的打開就好了焕梅,比如說項目上主要就是用到h264的編碼,但是需要主要的是ffmpeg本身有h264的解碼卦洽,但是沒有h264的編碼贞言,所以需要h264的編碼功能,需要鏈入h264的三方包阀蒂。

#!/bin/bash
# NDK的路徑该窗,根據(jù)實際安裝位置設(shè)置
NDK=E:/1.android.sdk/ndk-bundle/android-ndk-r16b
# 編譯針對的平臺,這里選擇最低支持android-14, arm架構(gòu)蚤霞,生成的so庫是放在libs/armeabi文件夾下的酗失,若針對x86架構(gòu),要選擇arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具鏈的路徑昧绣,arm-linux-androideabi-4.9與上面設(shè)置的PLATFORM對應(yīng)规肴,4.9為工具的版本號
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one(){
./configure \
    --disable-demuxers \
    --disable-muxers \
    --disable-decoders \
    --disable-encoders \
    --disable-protocols \
    --disable-filters \
    --enable-static \
    --disable-shared \
    --enable-version3 \
    --enable-gpl \
    --enable-libx264 \
    --extra-cflags=-I/mnt/e/ffmpeg/x264/build_window/include \
    --extra-ldflags=-L/mnt/e/ffmpeg/x264/build_window/lib \
    --enable-ffmpeg \
    --enable-demuxer=mov \
    --enable-demuxer=h264 \
    --enable-muxer=mov \
    --enable-muxer=h264 \
    --enable-protocol=file \
    --enable-decoder=rawvideo \
    --enable-decoder=mjpeg \
    --enable-decoder=h263 \
    --enable-decoder=mpeg4 \
    --enable-decoder=h264 \
    --enable-encoder=mjpeg \
    --enable-encoder=h263 \
    --enable-encoder=mpeg4 \
    --enable-encoder=libx264 \
    --enable-parser=h264 \
    --enable-zlib \
    --disable-network \
    --disable-avdevice \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-doc \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi-\
    --enable-cross-compile\
    --sysroot=$PLATFORM \
    --extra-cflags="-I$PLATFORM/usr/include"\
    --prefix=$PREFIX \
$ADDITIONAL_CONFIGURE_FLAG
#make clean
#make
#make install
}
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU
ADDITIONAL_CONFIGURE_FLAG=
build_one

更直接的方式是:直接用--disable-everthing 把基本所有的禁用,然后開相應(yīng)的enable夜畴,就沒必要寫
--disable-demuxers --disable-muxers --disable-decoders --disable-encoders --disable-protocols \這些腳本拖刃。

需要注意的是:
--extra-cflags=-I/mnt/e/ffmpeg/x264/build_window/include
--extra-ldflags=-L/mnt/e/ffmpeg/x264/build_window/lib
這兩個地址是編譯libx264的輸出地址,自己需要更新確認(rèn)贪绘。它們代表的意思是
-I:編譯階段生效的參數(shù)兑牡,用于指定頭文件的搜索路徑。
-L:鏈接階段生效的參數(shù)税灌,用于指定鏈接庫的搜索路徑均函,-l用于指定鏈接庫的名稱,一般兩者一起使用的話垄琐,就可以指定動態(tài)鏈接庫边酒。

另外一個比較常用的指令是 --enable-small,這個參數(shù)是優(yōu)化壓縮文件狸窘,有可能會降低性能墩朦,對生成的ffmpeg.exe 會縮小1.5M左右

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翻擒,隨后出現(xiàn)的幾起案子氓涣,更是在濱河造成了極大的恐慌牛哺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳吠,死亡現(xiàn)場離奇詭異引润,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痒玩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門淳附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠢古,你說我怎么就攤上這事奴曙。” “怎么了草讶?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵洽糟,是天一觀的道長。 經(jīng)常有香客問我堕战,道長坤溃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任嘱丢,我火速辦了婚禮薪介,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屿讽。我一直安慰自己昭灵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布伐谈。 她就那樣靜靜地躺著,像睡著了一般试疙。 火紅的嫁衣襯著肌膚如雪诵棵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天祝旷,我揣著相機(jī)與錄音履澳,去河邊找鬼。 笑死怀跛,一個胖子當(dāng)著我的面吹牛距贷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吻谋,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忠蝗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漓拾?” 一聲冷哼從身側(cè)響起阁最,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤戒祠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后速种,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姜盈,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霉涨。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡刁赦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壶栋,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布近上,位于F島的核電站,受9級特大地震影響拂铡,放射性物質(zhì)發(fā)生泄漏壹无。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一感帅、第九天 我趴在偏房一處隱蔽的房頂上張望斗锭。 院中可真熱鬧,春花似錦失球、人聲如沸岖是。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豺撑。三九已至,卻和暖如春黔牵,著一層夾襖步出監(jiān)牢的瞬間聪轿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工猾浦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陆错,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓金赦,卻偏偏與公主長得像音瓷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子夹抗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容