1. 程式人生 > >windows下編譯android使用的FFmpeg庫

windows下編譯android使用的FFmpeg庫

去年寫了篇在ubuntu下用NDK編譯FFmpeg,當時是費了很大的勁才編譯出幾個so庫!並不是每個人都有Ubuntu的,要弄屬於自己的FFmpeg庫就比較困難,正好這幾天公司不是很忙,於是在網路中尋找如何在windows下編譯出FFmpeg庫!  蒐集加整理加實踐最終得到FFmpeg!

準備:win10, NDK(具體什麼版本我也忘了,在AndroidStudio裡面下載的,感覺版本什麼的問題不大), ffmpeg3.0.9, MinGW

先說一下這個MinGW,這個在官網下載,他會提供一個下載器給你,線上安裝即可!之後把安裝的bin目錄配置到系統環境變數的Path裡

解壓下載的ffmpeg-3.0.9,下面要開始了!!!!

手動在ffmpeg-3.0.9目錄下新建一個文字檔案,取名build_android.sh將下列內容貼上進去

#!/bin/bash
#設定編譯中臨時檔案目錄,不然會報錯 unable to create temporary file
export TMPDIR=F:/zwyl/ffmpeg-3.0.9/ffmpegtemp
# NDK的路徑,根據實際安裝位置設定
NDK=F:/AStudioSDK/ndk-bundle
# 編譯針對的平臺,這裡選擇最低支援android-14, arm架構,生成的so庫是放在libs/armeabi資料夾下的,若針對x86架構,要選擇arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具鏈的路徑,arm-linux-androideabi-4.9與上面設定的PLATFORM對應,4.9為工具的版本號
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

# CPU=armv
# PREFIX=$(pwd)/android/$CPU
# ADDI_CFLAGS="-marm"
# build_one

#arm v6
#CPU=armv6
#OPTIMIZE_CFLAGS="-marm -march=$CPU"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=
#build_one

#arm v7vfpv3
# CPU=armv7-a
# OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=$CPU "
# PREFIX=./android/$CPU
# ADDITIONAL_CONFIGURE_FLAG=
# build_one

#arm v7n
#CPU=armv7-a
#OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=neon -marm -march=$CPU -mtune=cortex-a8"
#PREFIX=./android/$CPU 
#ADDITIONAL_CONFIGURE_FLAG=--enable-neon
#build_one

#arm v6+vfp
#CPU=armv6
#OPTIMIZE_CFLAGS="-DCMP_HAVE_VFP -mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU"
#PREFIX=./android/${CPU}_vfp 
#ADDITIONAL_CONFIGURE_FLAG=
# build_one        

說明:這是個shell指令碼檔案#一般表示註釋,修改好自己的NDK目錄,ffmpegtemp目錄先新建好,用來快取的

用notepad++ 開啟該指令碼,在編輯裡面有個文件格式轉換,選中轉換為UNIX格式,雖說是在windows下,但是指令碼要執行還是要使用unix格式

在MinGW的安裝目錄下找到msys.bat檔案,我的在這個目錄下:  C:\MinGW\msys\1.0 然後雙擊執行,接著cd到ffmpeg-3.0.9目錄下

給build_android.sh許可權,輸入 chmod +x build_android.sh然後就是執行

輸入  ./build_android.sh回車即可


可能是我的電腦慢的問題,回車後沒反應,不要急,大概半個小時就好了(電腦配置造成的吧)    

最後會在該目錄下生成一個android資料夾

中間碰到一個問題報SYNTAX ERROR:UNEXPECTED END OF FILE錯誤

網上查了說是因為沒有轉格式,但是轉了格式還是報錯,結果我把環境切到linux下執行(裝了雙系統),報的錯不一樣,因為語法錯了,找了半天是因為在方法體裡面少了個回車,這都被我發現了!

好了,可以愉快的使用ffmpeg玩耍了,具體怎麼玩,可以參見雷神的部落格