(一)Android 編譯ffmpeg動態(tài)鏈接庫 Mac OS系統(tǒng)

主要目的:通過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里面下載就行。
image.png

順便把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-這樣的前綴,而且他們放的位置也不一樣。所以增加一個自定義的配置項,用于指向不同的目錄。

我們可以看一看ndk目錄,驗(yàn)證一下:ndk/24.0.8215888/toolchains/llvm/prebuilt/darwin-x86_64/bin
image.png
image.png

圖中的-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,然后等待編譯完成,就能在輸出路徑中找到所有的鏈接庫。
image.png

到這里為止,就已經(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編譯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容