版權(quán)聲明:本文為衛(wèi)偉學(xué)習(xí)總結(jié)文章脯颜,轉(zhuǎn)載請注明出處!
本文在Linux環(huán)境下編譯ffmpeg源碼:
1.準(zhǔn)備工作:下載ndk和ffmpeg源碼贩据,我的是android-ndk-r16b-linux-x86_64和ffmpeg-3.3.9
-
2.如圖栋操,將下載的ndk和ffmpeg源碼解壓,放在同一目錄下
下載完成后把下載好的 ndk 和 FFmpeg 用 xftp 推到 linux 云主機(jī)上。把 ndk 解壓到 /lib/ndk 目錄下地淀,然后配置 NDK_PATH 環(huán)境變量:
第三方庫編譯的通用思想:- 1.看了看README.md
- 2.編譯項(xiàng)目(動靜態(tài)庫)需要MakeFile管理她倘,如果已經(jīng)有寫好的MakeFile可以嘗試著用make命令去編譯,如果沒有需要自己寫Makefile或者采用cmake構(gòu)建
- 3.如果報錯需要解決作箍,一般情況下都是Makefile的一些配置文件沒有生成硬梁,所有一般需要運(yùn)行configure文件
- 4.生成配置文件之后,再次運(yùn)行make,但是編譯后的文件(elf,so,a)只能在當(dāng)前類型系統(tǒng)上運(yùn)行
- 5.如果需要跑到android或者ios那么需要交叉編譯
- 6.因此我們一般都需要往configure文件里面?zhèn)饕恍┚幾g參數(shù)
FFmpeg 直接解壓到工作目錄下:
Makefile:2: config.mak: No such file or directory
Makefile:67: /common.mak: No such file or directory
Makefile:114: /libavutil/Makefile: No such file or directory
Makefile:114: /library.mak: No such file or directory
Makefile:116: /doc/Makefile: No such file or directory
Makefile:206: /tests/Makefile: No such file or directory
make: *** No rule to make target '/tests/Makefile'. Stop.
這些文件怎么來?在 configure 腳本文件里面阶剑,當(dāng)然剛開始基本看不懂,后來查看紅橙博客跃巡,只需要再寫一個build,sh腳本來執(zhí)行./configure腳本文件即可,至于需要傳遞哪些參數(shù)牧愁,怎么裁剪 so 動態(tài)庫這里先不詳細(xì)講素邪,大家可以用 來查看。根據(jù)自身需求編譯FFmpeg庫文件腳本ffmpeg_build.sh內(nèi)容:
#!/bin/bash
. /etc/profile
function build
{
echo "start build ffmpeg for $ARCH"
./configure --target-os=linux \
--prefix=$PREFIX --arch=$ARCH \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--cross-prefix=$CROSS_COMPILE \
--enable-cross-compile \
--sysroot=$SYSROOT \
--enable-small \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "build ffmpeg for $ARCH finished"
}
ARCH=arm
CPU=arm
PREFIX=$(pwd)/android/$ARCH
TOOLCHAIN=$NDK_PATH/android-toolchains/arm-19
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
ADDI_CFLAGS="-marm"
SYSROOT=$TOOLCHAIN/sysroot
build
如果大家不出意外會得到以上文件猪半,我們發(fā)現(xiàn)編譯出來是 linux 的命名方式兔朦。只能在Linux平臺下運(yùn)行。如果想到android平臺下運(yùn)行磨确,還需要用到NDK目錄下make_standalone_toolchain.py交叉工具鏈沽甥,生成android平臺的so庫文件
ubuntu@VM-0-9-ubuntu:~/ffmpeg-3.3.9/android/arm/lib$ ls
libavcodec.so libavformat.so libswresample.so
libavcodec.so.57 libavformat.so.57 libswresample.so.2
libavcodec.so.57.89.100 libavformat.so.57.71.100
libswresample.so.2.7.100
libavdevice.so libavutil.so libswscale.so
libavdevice.so.57 libavutil.so.55 libswscale.so.4
libavdevice.so.57.6.100 libavutil.so.55.58.100 libswscale.so.4.6.100
libavfilter.so libpostproc.so pkgconfig
libavfilter.so.6 libpostproc.so.54
libavfilter.so.6.82.100 libpostproc.so.54.5.100
用的ndk build/tools路徑下的make-standalone-toolchain.py 腳本文件
book@www.100ask.org:/lib/ndk/androanid-ndk-r20/build/tools$ sudo ./make_standalone_toolchain.py --arch arm --api 19 --install-dir /lib/ndk/android-ndk-r20/android-toolchains/android-19/arch-arm
我們還需要在 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)'
替換成如下添加congfigure和ffmpg_build.sh的執(zhí)行權(quán)限:
chmod u+x ffmpeg_build.sh
執(zhí)行ffmpeg_build.sh腳本后生成如下圖綠色的顏色的.so文件就可以在arm平臺上運(yùn)行啦。