主要目的:通過ffmpeg,利用腳本打出屬于自己的音視頻處理so庫。
1、下載ffmpeg的源碼
官網(wǎng)地址:http://www.ffmpeg.org/download.html
里面有Linux、macOS、Windows系統(tǒng)的版本,根據(jù)自己的需要下載對應(yīng)的版本。下載完成后把源碼放在你喜歡的路徑,如:/Users/ccc/ffmpeg
2、 安裝Androidstudio
官網(wǎng)地址: https://developer.android.google.cn/studio
3、下載NDK
這個NDK不需要另外下載,直接在AndroidStudio里面的SDK Manager里面下載就行。
順便把CMake也裝上,這個也有用。
到這里,需要的工具基本齊了,下面開始編譯自己的so庫。
4、經(jīng)??吹骄W(wǎng)上其他的文章介紹,接下來都是修改configure文件,怎么改?為什么要改?不改行不行?
怎么改:在configure文件中,搜索Toolchain options,增加一個自定義的參數(shù)配置。
Toolchain options:
--arch=ARCH select architecture [$arch]
--cpu=CPU select the minimum required CPU (affects
instruction selection, may crash on older CPUs)
--cross-prefix=PREFIX use PREFIX for compilation tools [$cross_prefix]
# 增長這一行
--cross-prefix-clang=PREFIX use PREFIX for compilation tools [$cross_prefix_clang]
--progs-suffix=SUFFIX program name suffix []
--enable-cross-compile assume a cross-compiler is used
--sysroot=PATH root of cross-build tree
再搜索CMDLINE_SET,也增加上面的自定義參數(shù)配置。
CMDLINE_SET="
$PATHS_LIST
ar
arch
as
assert_level
build_suffix
cc
objcc
cpu
cross_prefix
#增長這一行
cross_prefix_clang
custom_allocator
cxx
dep_cc
最后再搜索set_default target_os,進(jìn)行一下修改:
set_default target_os
if test "$target_os" = android; then
cc_default="clang"
# 增長這一行
cxx_default="clang++"
fi
ar_default="${cross_prefix}${ar_default}"
# 修改這一行
cc_default="${cross_prefix_clang}${cc_default}"
# 修改這一行
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
ranlib_default="${cross_prefix}${ranlib_default}"
strip_default="${cross_prefix}${strip_default}"
windres_default="${cross_prefix}${windres_default}"
sysinclude_default="${sysroot}/usr/include"
這樣修改之后咱們在編譯時就可使用咱們新增的cross_prefix_clang參數(shù)了,而后其余的如nm,ar,ranlib,strip則繼續(xù)使用cross_prefix參數(shù)。
為什么要這樣改?
首先,需要先了解編譯庫的流程。
①編寫自定義的編譯腳本
②腳本根據(jù)各個配置項,去尋找對應(yīng)的庫工具路徑
③生成動態(tài)鏈接庫
而上面的修改,目的就是為了第二步能正常找到對應(yīng)的庫工具。配置中的nm,ar,ranlib,strip這些的前綴,是arm-linux-androideabi-,而cc,cxx這兩個是arm-linux-androideabi21-這樣的前綴,而且他們放的位置也不一樣。所以增加一個自定義的配置項,用于指向不同的目錄。


圖中的-clang和-clang++前面,都是跟版本的,nm,ar,ranlib,strip就不是,如果我們不修改configure文件里的配置項,就會編譯失敗。
編寫編譯腳本
在ffmepg的文件夾中新建一個文件夾build-android,里面再新建一個build-android.sh文件。
#!/bin/bash
#NDK路徑
export NDK=/Users/chenjy/Library/Android/sdk/ndk/20.0.5594570
#CPU類型
export CPU=armv7-a
# 目標(biāo)Android版本
API=19
#架構(gòu)類型
export ARCH=arm
export SYSROOT=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot
#交叉編譯工具鏈
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
#編譯成功后,存放的路徑
export PREFIX=./build-android/dist
cd .. #回到ffmpeg根目錄
echo "start configure"
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--cross-prefix-clang=$TOOLCHAIN/bin/armv7a-linux-androideabi21- \
--target-os=android --arch=$ARCH --cpu=$CPU \
--enable-gpl --enable-version3 \
--disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \
--disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
--disable-avdevice --disable-postproc --disable-avfilter \
--disable-debug \
--sysroot=$SYSROOT \
--extra-cflags="-I$SYSROOT/usr/include" \
--extra-ldflags="-L$SYSROOT/usr/lib" \
--enable-small \
--enable-jni \
--enable-mediacodec
--disable-everything \
--enable-decoder=hevc --enable-decoder=h264 --enable-decoder=aac \
--enable-parser=h264 --enable-parser=hevc --enable-parser=aac \
--enable-demuxer=flv --enable-demuxer=mov --enable-demuxer=avi --enable-demuxer=mpegts \
--enable-protocol=file --enable-protocol=hls
echo "make clean start"
make clean
echo "make start"
make -j4
echo "make finished"
make install
echo "make install finished"
打開終端,轉(zhuǎn)到腳本文件的所在路徑,然后輸入./build-android.sh,然后等待編譯完成,就能在輸出路徑中找到所有的鏈接庫。
到這里為止,就已經(jīng)編譯出我們需要的so庫了,之后就是怎么在android項目中使用了。這個會在以后的文章中進(jìn)行記錄。
還有一個問題,就是能不能不修改configure文件?
其實(shí)也是可以,只需要明確指定cc和cxx的路徑就行。
--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang \
--cxx=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++ \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
腳本部分配置項解釋
1.—prefix:指定編譯輸出的文件路徑
2.—target-os:指定目標(biāo)操作系統(tǒng)
3.--disable-static:禁止生成靜態(tài)庫
4.—disable-programs:禁止生成ffplay、ffmpeg等可執(zhí)行文件
5.—disable-doc:禁止生成文檔
6.—enable-shared:生成動態(tài)鏈接庫
7.enable-cross-compile:開啟交叉編譯(跨平臺編譯)
8.make -j12:定義用幾個CPU編譯