您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
ubuntu-18.04.5-desktop-amd64與ndk(r21e)交叉編譯ffmpeg4.3.2(包含libx264)
发布时间:2021-06-20 17:57:59编辑:雪饮阅读()
這次實現的是交叉編譯ffmpeg4.3.2與libx264的結合,并且是在android-ndk-r21e基礎上進行編譯的。
從r17之後ndk結構還是有了一些影響較大的變化,對於ffmpeg來説4.3.2相較於之前在編譯上有些編譯選項也是有所變動的。
那麽編譯脚本就需要重新修改一下了。
那麽編譯脚本如build.sh:
#!/bin/bash
NDK=/disk2/lost+found/android-ndk-r21e
HOST_TAG=linux-x86_64
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/$HOST_TAG
AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
AS=$TOOLCHAIN/bin/aarch64-linux-android-as
CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++
LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
NM=$TOOLCHAIN/bin/aarch64-linux-android-nm
#arm64 x86 x86_64 对应 aarch64 i686 x86_64
PREFIX=./SO/aarch64
function build
{
./configure \
--prefix=$PREFIX \
--disable-static \
--enable-shared \
--enable-small \
--enable-gpl \
--enable-version3 \
--enable-pic \
--disable-doc \
--enable-asm \
--enable-cross-compile \
--target-os=android \
--arch=aarch64 \
--cc=$CC \
--ar=$AR \
--cxx=$CXX \
--ranlib=$RANLIB \
--strip=$STRIP \
--nm=$NM \
--sysroot=/disk2/lost+found/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
--enable-libx264 \
--extra-cflags="-I/usr/local/include" \
--extra-ldflags="-L/usr/local/lib/x264/aarch64"
make clean
make -j4
make install
}
Build
這個脚本問題是不大,主要的問題還是在libx264上面的。
在libx264結合ffmpeg4.3.2編譯的時候還是跑了不少彎路。
首先這裏編譯的前提是你的libx264已經安裝了。
上面脚本中最重要的是這兩個:
--extra-cflags="-I/usr/local/include" \
--extra-ldflags="-L/usr/local/lib/x264/aarch64"
這兩個分別指定了頭文件(.h)和庫文件(.so)的路徑
這兩個路徑必須要包含有libx264的頭文件和庫文件,且都是合適的。
這裏最重要的就是“合適”二字的理解。
一般如果安裝的libx264是合適的,且正好頭文件和庫文件都在ffmpeg4.3.2編譯時候沒有特意指定頭文件和庫文件路徑時候,所以搜尋的頭文件和庫文件中都能找到。那麽上面頭文件和庫文件路徑都不用指定,且能成功交叉編譯ffmpeg+libx264.
但是一般這裏的合適的指標很難達成,因爲畢竟是交叉編譯。
如果你按照一般編譯如:
./configure --enable-shared
這種形式進行編譯,則所謂的適合應該是你當前運行編譯命令所在的設備上。
此時在上面脚本進行交叉編譯時候就算你頭文件和庫文件都存在于configure搜尋路徑中,那麽也會編譯報錯libx264找不到。查看編譯日志(ffmpeg4.3.2的編譯日志在ffbuild/config.log中)會發現大概意思是說libx264不合適。
雖然該一般編譯命令有問題,但是也有一個比較重要的選項--enable-shared,--enable-shared選項必須要,經過查詢資料以及我自己的理解,這個應該是共享庫,如果沒有這個,應該只是編譯出來能運行,但是庫so應該沒有,另外頭文件應該也是沒有的。
那麽所謂的合適的libx264是怎樣來的?
我起初以爲我下載的libx264應該不屬於我這個ubuntu系統,因爲之前是隨便在百度上找到的一個,於是我在libx264官網找到了libx264發現它也就提供一個git倉庫地址,進去之後我發現也是沒有按系統分開讓你按系統下載的。難道不分系統?然後我看官網還有一個二進制資源可以在綫瀏覽(也可以下載)。瀏覽發現有分好幾個系統的二進制資源。就是沒有ubuntu的,但有一個同為Linux的debian系統的。好吧,那我去debian系統去交叉編譯ffmpeg4.3.2與libx264?由於debian可能不是商業化的系統,所以用起來個人感覺沒有ubuntu好用,并且最後在得到libx264于debian中的二進制資源后發現沒有後綴,於是修改為.tar、.tar.gz、.zip等都無法正常解壓。無法解壓又如何編譯?但是無意間看到某個解壓,忘了是tar還是unzip來著,提示說是二進制文件,稍加思索突然發現自己好笨,二進制不就是可以直接運行的嗎?(現在看來幸好沒有把它想成是類似rpm一樣的包,畢竟rpm包也可以通過rpm安裝,有點可以運行的意思,如果這樣想我現在可能還沒有搞定呢,哈哈),於是我瞬間懂了,它這裏所謂的各個系統的二進制資源包應該都是libx264官方自己默認給這幾個系統編譯出來的(現在想想,這個地方也有一個坑,因爲當時有libx264二進制資源列表裏面的系統好像就有arm系列的而且也有arm64系列的,我的安卓就是arm64,也是我這次的目標),所以當時就想著這應該是不分系統的,所以我就對這個所謂的適合的libx264有了一個新的認識,上面交叉編譯ffmpeg4.3.2與libx264脚本中所要的libx264頭和庫應該都是要和交叉編譯目標設備(系統cpu架構)適合的才行,所以按照這個猜想就要實現一個libx264的編譯脚本以編譯出所謂適合的libx264的頭和庫,那麽有交叉編譯脚本有如:
x264_build.sh:
#!/bin/bash
NDK=/disk2/lost+found/android-ndk-r21e
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
export API=21
export AR=$TOOLCHAIN/bin/aarch64-linux-android-ar
#export AS=$TOOLCHAIN/bin/arm-linux-androideabi-as
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/aarch64-linux-android-ld
export RANLIB=$TOOLCHAIN/bin/aarch64-linux-android-ranlib
export STRIP=$TOOLCHAIN/bin/aarch64-linux-android-strip
function build_one
{
echo 'start' $kind
./configure \
--enable-shared \
--enable-pic \
--host=$my_host \
--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
--libdir=$libpath
make clean
make
make install
echo 'end' $kind
}
#aarch64
kind=aarch64
my_host=aarch64-linux-android
libpath=/usr/local/lib/x264/$kind
build_one
按照上面我們交叉編譯ffmpeg4.3.2與libx264的輸出路徑定義為./SO/aarch64,雖然最後這裏沒有相關的libx264的頭看到
這裏猜想應該是進入了libavcodec.so裏面了,因爲之前用https://github.com/tanersener/ffmpeg-kit/tree/main/android開源項目時候好像報錯地方與libavcodec有關,最後在https://www.gaojiupan.cn/manshenghuo/chengxurensheng/3796.html
一文中反正是最後沒有報錯libx264的錯誤了,那麽不管這個libx264現在是在哪裏,反正是進入了ffmpeg4.3.2交叉編譯之後的軟件包裏了,可以通過ffmpeg4.3.2調用libx264庫就行了。
補充:
上面交叉編譯合適的libx264時候的輸出目錄,在x264_build.sh中的libpath變量定義的,如上面的x264_build.sh中定義的如:libpath=/usr/local/lib/x264/$kind
关键字词:ubuntu-18.04.5-desktop-amd64,ndk,r21e,ffmpeg4.3.2,libx264
上一篇:AndroidStudio如何使用(導入).aar包(第三方依賴如何本地化)
下一篇:ffmpeg-kit的使用(android studio第三方庫、依賴的使用)編譯安卓libx264編譯輸出aar