編譯環(huán)境是win10董虱,ndk r14,ffmpeg3.0
1.首先自然是下載NDK及FFmpeg 申鱼。windows下編譯的話還要下載個(gè)MinGW
下載完畢后MinGW需要安裝愤诱。安裝時(shí)其實(shí)先裝的是個(gè)下載管理器,到選擇安裝選項(xiàng)的時(shí)候要選上msys-base和mingw32-gcc-ada兩項(xiàng)捐友。
另外兩個(gè)只是解壓就好了淫半。
然后開(kāi)始做編譯前的配置。
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.在FFmpeg目錄里創(chuàng)建ffmpegtemp目錄作為臨時(shí)文件目錄
創(chuàng)建build_android.sh文件作為編譯腳本
#!/bin/bash
export TMPDIR=F:/demo/ffmpeg-3.0/ffmpegtemp #設(shè)置編譯中臨時(shí)文件目錄科吭,不然會(huì)報(bào)錯(cuò) unable to create temporary file
# NDK的路徑昏滴,根據(jù)實(shí)際安裝位置設(shè)置
NDK=D:/adt-bundle-windows-x86_64-20131030/sdk/ndk-bundle
# 編譯針對(duì)的平臺(tái),這里選擇最低支持android-14, arm架構(gòu)对人,生成的so庫(kù)是放在libs/armeabi文件夾下的谣殊,若針對(duì)x86架構(gòu),要選擇arch-x86
PLATFORM=$NDK/platforms/android-14/arch-arm
# 工具鏈的路徑牺弄,arm-linux-androideabi-4.9與上面設(shè)置的PLATFORM對(duì)應(yīng)姻几,4.9為工具的版本號(hào)
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
$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
}
# 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
其中要注意TMPDIR、NDK势告、TOOLCHAIN蛇捌、--cross-prefix對(duì)應(yīng)實(shí)際目錄地址,可別漏了咱台。
./configure部分根據(jù)自己的需要調(diào)整功能络拌。全要的話庫(kù)文件未免太大。
4.方便起見(jiàn)在環(huán)境變量中的Path中添加路徑NDK路徑和MinGW的bin目錄路徑吵护,這兩個(gè)目錄通常長(zhǎng)類(lèi)似這樣:
D:\adt-bundle-windows-x86_64-20131030\sdk\ndk-bundle
C:\MingG\bin
5.運(yùn)行MinGW\bin目錄下的msys.bat盒音,cd到ffmpeg目錄執(zhí)行build_android.sh
6.等待,繼續(xù)等待馅而,還是等待祥诽。
7.理論上一直等下去就能見(jiàn)到光明,但是實(shí)際情況是開(kāi)始編譯后會(huì)報(bào)各種錯(cuò)瓮恭。萬(wàn)幸都不是什么關(guān)鍵性的地方出錯(cuò)雄坪。報(bào)錯(cuò)的地方自己修改下或者干脆注釋掉算了。大部分其實(shí)也不用管屯蹦。
修改后重新編譯维哈,重新等待。
(期間會(huì)生成相應(yīng)的config.h等文件登澜,以后在android studio里編譯執(zhí)行文件的時(shí)候會(huì)用到阔挠。)
8.在快要忘了我還在編譯著的時(shí)候,終于編譯完了脑蠕。會(huì)看到ffmpeg的目錄下生成了一個(gè)android目錄购撼。里面就是我們的成果了。
附1:看到lib里一堆.so是不是特?zé)┰昵聪桑縟on't panic迂求。可以把他們打包成一個(gè).so晃跺。只要修改下編譯配置揩局。(要注意的是,如果你那個(gè)configure文件已經(jīng)按上面方法修改過(guò)了掀虎,那么把他改回來(lái)凌盯。)
設(shè)置
–enable-static
–disable-shared
以及make install后面的:
$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 \
這里需要注意的是$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a這里的4.9要和上面的版本一致付枫。然后還要注意這里面的各種文件夾路徑。
改完大致長(zhǎng)這樣:(這個(gè)文件使用的ffmpeg版本和配置與上面的略有不同十气,這不重要励背,看自己需求)
#!/bin/bash
export TMPDIR=F:/demo/ffmpeg-3.2.4/ffmpegtemp #設(shè)置編譯中臨時(shí)文件目錄,不然會(huì)報(bào)錯(cuò) unable to create temporary file
# NDK的路徑砸西,根據(jù)自己的安裝位置進(jìn)行設(shè)置
NDK=D:/adt-bundle-windows-x86_64-20131030/sdk/ndk-bundle
# 編譯針對(duì)的平臺(tái)叶眉,可以根據(jù)自己的需求進(jìn)行設(shè)置
# 這里選擇最低支持android-14, arm架構(gòu),生成的so庫(kù)是放在
# libs/armeabi文件夾下的芹枷,若針對(duì)x86架構(gòu)衅疙,要選擇arch-x86
SYSROOT=$NDK/platforms/android-14/arch-arm/
# 工具鏈的路徑,根據(jù)編譯的平臺(tái)不同而不同
# arm-linux-androideabi-4.9與上面設(shè)置的PLATFORM對(duì)應(yīng)鸳慈,4.9為工具的版本號(hào)饱溢,
# 根據(jù)自己安裝的NDK版本來(lái)確定,一般使用最新的版本
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccel=h264_vaapi \
--enable-hwaccel=h264_dxva2 \
--enable-hwaccel=mpeg4_vaapi \
--enable-hwaccels \
--enable-static \
--enable-jni \
--enable-mediacodec \
--enable-asm \
--disable-shared \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
$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 \
}
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
# 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
這樣編譯出來(lái)的就是一個(gè)單獨(dú)的libffmpeg.so文件走芋。
附2:編譯這個(gè)問(wèn)題其實(shí)前后研究了三天绩郎,各種出錯(cuò),各種找不到文件啦翁逞,無(wú)法創(chuàng)建可執(zhí)行文件啦肋杖。放棄了一個(gè)禮拜后今天再拿出來(lái)整理了一遍,忽然挖函,他就成功了状植。
相關(guān)github項(xiàng)目地址:https://github.com/codeqian/ffmpegCLDemo
(誠(chéng)邀各位多去點(diǎn)幾個(gè)star)
參考:
Android最簡(jiǎn)單的基于FFmpeg的例子(一)---編譯FFmpeg類(lèi)庫(kù)
Android最簡(jiǎn)單的基于FFmpeg的例子(三)---編譯FFmpeg成一個(gè)SO庫(kù)
FFmpeg 編譯(2)--單一版