windows 環(huán)境下編譯 ffmpeg so文件

簡介

公司項目需求, 需要截取錄制一份 mp4 的視頻文件, 此時想到了 ffmpeg 的強大功能, 但是 Android 項目如何引入 ffmpeg 是個十分頭疼的難題, Google 了很久沒有一個適合初學(xué)者 windows 下編譯 ffmpeg 的指導(dǎo)文章 , 要么是在 mac 下編譯 , 要么是在 Linux 下編譯 ffmpeg , 廢話少說 , 下面開擼 :

開發(fā)環(huán)境以及工具下載

Windows7 環(huán)境下 NDK 版本 :?android-ndk-r14b? FFmpeg版本 :?ffmpeg-3.3.5??

大家請注意 : 版本不一樣 , 可能產(chǎn)生不一樣的問題 , 大家編譯前最好看清版本號 , 編譯的時候很容易產(chǎn)生很多問題 ;下載??MinGW?并安裝 , 安裝成功以后打開? MinGW Installation Manager ,? 左邊選項欄選擇 Basic Setup? ,? 然后標記勾選? msys-base 和 mingw32-gcc-ada ,? 點擊頭部 [Installation] - [Apply Changes]? 安裝 ;

安裝成功以后如下圖所示 :

?配置環(huán)境變量 , 根據(jù)本地安裝目錄來配置 :

并打開本地安裝目錄下的msys.bat , 我本地安裝目錄是????“C:\MinGW\msys\1.0” , 大家根據(jù)各自的安裝目錄里 , 如下圖所示 :


編輯FFmpeg腳本文件

以上操作順利完成以后 , 下面就可以開始來編輯? FFmpeg? 相關(guān)腳本文件 , 分別解壓? ffmpeg? 和 ndk ,? 在? ffmpeg-3.3.5 下創(chuàng)建一文件夾? ?(ffmpegtemp : 是何用途至今沒搞明白 ) 和一個文件(build_android.sh) , 下面主要是編輯? build_android.sh? 文件內(nèi)容 ,?特別重要 , 請務(wù)必認真配置?,不然導(dǎo)致的錯誤會讓你崩潰;

先配置一下 ffmpeg-3.3.5 下的 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)'

這主要是為了修改生成 so 文件的文件名格式 , 如若合成? libffmpeg.so 文件這里可以不用配置 ;

下面是 build_android.sh 文件內(nèi)容 :

#!/bin/bash

export TMPDIR=D:/ffmpeg/ffmpeg-3.3.5/ffmpegtemp #這句很重要,不然會報錯 unable to create temporary file in

# NDK的路徑,根據(jù)自己的安裝位置進行設(shè)置

NDK=D:/NDK/android-ndk-r14b

# 編譯針對的平臺,可以根據(jù)自己的需求進行設(shè)置

# 這里選擇最低支持android-14, arm架構(gòu),生成的so庫是放在

# libs/armeabi文件夾下的,若針對x86架構(gòu),要選擇arch-x86

PLATFORM=$NDK/platforms/android-21/arch-arm

# 工具鏈的路徑,根據(jù)編譯的平臺不同而不同

# arm-linux-androideabi-4.9與上面設(shè)置的PLATFORM對應(yīng),4.9為工具的版本號,

# 根據(jù)自己安裝的NDK版本來確定,一般使用最新的版本

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64

function build_one

{

./configure \

--prefix=$PREFIX \

--target-os=linux \

--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

--arch=arm \

--sysroot=$PLATFORM \

--extra-cflags="-I$PLATFORM/usr/include" \

--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \

--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \

--disable-shared \

--enable-runtime-cpudetect \

--enable-gpl \

--enable-small \

--enable-cross-compile \

--disable-debug \

--enable-static \

--disable-doc \

--disable-asm \

--disable-ffmpeg \

--disable-ffplay \

--disable-ffprobe \

--disable-ffserver \

--disable-postproc \

--disable-avdevice \

--disable-symver \

--disable-stripping \

$ADDITIONAL_CONFIGURE_FLAG

sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h

sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h

sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h

sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h

sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h

sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h

sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h

sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h

make clean

make -j4

make install

$TOOLCHAIN/bin/arm-linux-androideabi-ld \

-rpath-link=$PLATFORM/usr/lib \

-L$PLATFORM/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

}

# arm v7vfp

CPU=armv7-a

OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "

PREFIX=./android/$CPU-vfp

ADDITIONAL_CONFIGURE_FLAG=

build_one

注意 : 上面加粗劃線的地方是把生成的六個文件 (libavcodec-57.so , libavfilter-6.so , libavformat-57.so , libavutil-55.so,?libswresample-2 , libswscale-4.so) 合成 libffmpeg.so 文件 , 如若不想合成可以把橫線的地方刪掉 , 并把?--disable-shared? 和?--enable-static? 改為 enable-shared?和 disable-static ;

上面 TMPIR 、NDK 這兩個目錄地址一定要根據(jù)你本地的解壓后的目錄進行配置 , 上面文件的內(nèi)容只是針對 arm 架構(gòu)的 , 像x86 、x86-64 、arm64-v8a 這些架構(gòu)的配置只要參照下面標紅的地方根據(jù)不同架構(gòu)做相應(yīng)的修改就行了;

下圖第二處紅框的修改針對 x86-64 架構(gòu)一定要把 lib 改為 lib64?這個文件 , 不然每次編譯都會出錯 ;

上述文件編輯好以后 , 我們打開 msys.bat , 切換到當前? ffmpeg-3.3.5 所在的目錄 ;


依次執(zhí)行如下兩條命令 :

chmod +x? build_android.sh

./build_android.sh

命令執(zhí)行結(jié)果展示 :


如果一切進行順利的話 , ffmpeg? 目錄下會生成? “android”? 文件夾已經(jīng)相應(yīng)框架下的? so 文件

這樣我們就生成了所需要的? so? 文件 , 之后 我們就可以利用? eclipse? 或者? Android studio 開發(fā)工具配置 NDK 開發(fā)環(huán)境進行開發(fā) , 由于公司項目還在? eclipse? 上,未遷移到? Android studio , eclipse? 上開發(fā)配置比較麻煩,建議大家用? Android studio? 進行編譯開發(fā);網(wǎng)上有關(guān)? Android studio? 配置? NDK? 開發(fā)流程很多 , 希望大家參考 , 本文主要講解? windows? 下編譯? ffmpeg? so文件;

總結(jié)

本文旨在詳細介紹? windows 下? so 文件的生成 , 有任何問題大家可以及時反饋 , 謝謝 !?。?可能有部分朋友很納悶此時? ffmpeg-3.4.1 最新版本已經(jīng)發(fā)布 , 為何我還在用老版本 3.3.5 ; 之前我開始也是用3.4.1 進行編譯 , 奈何碰到如下問題 , 能力有限 , 無法解決 , 請各位路過的大神幫忙看下 , 感激不盡 。 本文到此處結(jié)束了 , 謝謝各位的捧場 !

源碼地址

參考資料 :

Android Studio下編譯FFmpeg so文件

windows環(huán)境下編譯android中使用的FFmpeg

Android最簡單的基于FFmpeg的例子(一)---編譯FFmpeg類庫

Android最簡單的基于FFmpeg的例子(三)---編譯FFmpeg成一個SO庫

編譯可供Android使用的FFmpeg庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380