FFmpeg開發筆記(九)Linux交叉編譯Android的x265庫

aqi00發表於2024-03-30
《FFmpeg開發實戰:從零基礎到短影片上線》一書的“12.1.2 交叉編譯Android需要的so庫”介紹瞭如何在Windows環境交叉編譯Android所需FFmpeg的so庫,前文又介紹瞭如何在Linux環境交叉編譯Android所需FFmpeg的so庫,接下來介紹如何在Linux環境交叉編譯Android所需x265的so庫。

1、安裝cmake

執行以下命令安裝cmake

yum install cmake git

2、下載Linux版本的android-ndk-r21e(如已下載則忽略)

登入Linux伺服器(比如華為雲的尤拉系統),依次執行下面的命令。

cd /usr/local/src
curl -O https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip
unzip android-ndk-r21e-linux-x86_64.zip

3、上傳x265的原始碼

從下面連結下載x265的原始碼包
https://bitbucket.org/multicoreware/x265_git/downloads/x265_3.5.tar.gz
解壓x265原始碼包,修改x265_3.5/build/aarch64-linux目錄下的crosscompile.cmake,把下面兩行

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

改為下面兩行

set(CMAKE_C_COMPILER aarch64-linux-android24-clang)
set(CMAKE_CXX_COMPILER aarch64-linux-android24-clang++)

4、配置x265的原始碼

進入x265_3.5下的build/aarch64-linux目錄,執行以下命令配置x265:

export PATH=$PATH:/usr/local/src/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin
./make-Makefiles.bash

命令列彈出的選項介面中,注意下列三項修改:
(1)把CMAKE_INSTALL_PREFIX這項改為/usr/local/app_x265(按向下鍵定位到該項,再按Enter鍵,即可按照vi方式編輯路徑)
(2)把ENABLE_ASSEMBLY這項改為OFF(按向下鍵定位到該項,再按Enter鍵,即可把ON改為OFF)
(3)把ENABLE_CLI這項改為OFF(按向下鍵定位到該項,再按Enter鍵,即可把ON改為OFF)
接著按c鍵開始配置,再按e鍵退出配置,然後按g鍵開始生成。

5、修改x265的編譯規則

進入x265_3.5原始碼下的build/aarch64-linux/CMakeFiles/x265-shared.dir目錄,注意修改下面三個檔案:
(1)修改該目錄的link.txt,把檔案中的所有“libx265.so.199”替換為“libx265.so”。同時刪除檔案末尾的“ -lpthread -lrt”。
(2)同目錄的relink.txt修改說明同link.txt。
(3)修改同目錄下面的build.make,把該檔案中的所有“libx265.so.199”替換為“libx265.so”,把所有的“libx265.so”替換為“libx265.so.199”。注意A和B互換名稱的時候,可以設定第三個名稱C,比如先把A替換為C,接著B替換為A,然後C替換為B。

6、編譯和安裝x265

進入x265_3.5原始碼下的build/aarch64-linux目錄,執行以下命令編譯和安裝x265:

make
make install

7、調整x265的pc描述檔案

修改/usr/local/app_x265/lib/pkgconfig下面的x265.pc,該檔案的“Libs.private”選項裡面去掉“-lrt”,也就是改成下面這行:

Libs.private: -lc++ -lm -lgcc -ldl -lgcc -ldl -ldl

8、新增PKG_CONFIG_PATH路徑

Linux的profile檔案位於使用者初始目錄的.bash_profile。執行以下命令編輯當前使用者的profile檔案:

cd
vi .bash_profile

往.bash_profile的檔案末尾新增下面一行:

export PKG_CONFIG_PATH=/usr/local/app_x265/lib/pkgconfig:$PKG_CONFIG_PATH

儲存並退出.bash_profile之後,執行以下命令載入環境變數:

source .bash_profile

然後執行下面的環境變數檢視命令,確保x265的環境變數已經成功載入。

env | grep PKG

9、重新編譯FFmpeg啟用x265

開啟《FFmpeg開發實戰:從零基礎到短影片上線》隨書原始碼的chapter12/config_ffmpeg_full.sh,將該檔案另存為config_ffmpeg_x265.sh,並在檔案內部這行

  --enable-libx264 \

的下面增加如下一行配置

  --enable-libx265 \

接著把config_ffmpeg_x265.sh上傳到伺服器的FFmpeg原始碼目錄,執行下面命令賦予可執行許可權。

chmod +x config_ffmpeg_x265.sh

然後執行下列命令配置、編譯和安裝FFmpeg

./config_ffmpeg_x265.sh
make clean
make -j4
make install

10、把so檔案匯入App工程

(1)把FFmpeg交叉編譯好的include目錄(位於/usr/local/app_ffmpeg/include)整個複製到App工程的src/main/cpp目錄下。
(2)在src\main目錄下建立jniLibs目錄,並在jniLibs下面建立子目錄arm64-v8a,把FFmpeg交叉編譯好的8個so檔案(位於/usr/local/app_ffmpeg/lib)全部複製到arm64-v8a目錄下。
(3)config_ffmpeg_x265.sh裡面啟用的幾個第三方庫的so檔案也一塊複製到arm64-v8a目錄下,包括x264、x265、mp3lame、freetype等。
(4)給App工程的build.gradle的android→defaultConfig→externalNativeBuild→cmake節點內部增加下面配置。

    abiFilters "arm64-v8a"
    arguments '-DANDROID_STL=c++_shared' // FFmpeg整合x265時需要

如果不加,App執行時會報錯“java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found”。
(5)在Android Studio上編譯執行App工程,觀察App是否正常執行。​

相關文章