簡介
公司項目需求, 需要截取錄制一份 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é)束了 , 謝謝各位的捧場 !
參考資料 :
windows環(huán)境下編譯android中使用的FFmpeg
Android最簡單的基于FFmpeg的例子(一)---編譯FFmpeg類庫