使用NDK(r20)編譯FFmpeg


前兩天在論壇上看到一個問題,大意是怎么在UBUNTU下使用NDK-r20編譯FFmpeg。我第一反應是不該用r20,因為我在很早前用過沒有gcc版本的NDK,發現有很多問題不能編譯,就立馬回復了個使用r12b來編譯。回到家我細想了一下,如果我就是想要用r20的NDK編譯最新的FFmpeg呢?不如我們花點時間來折騰下。

NDK不知道從什么版本徹底改革,使用了clang來編譯,這還不是最關鍵的,在新的NDK里sysroot也改變了(關鍵是google在NDK根目錄里建了一個sysroot--錯誤的sysroot),這就導致FFmpeg過不了cc檢測。常見的報錯都是沒有crtbegin_so.o或者找不到系統庫連接。

所以sysroot其實是罪魁禍首,如果我們使用正確的sysroot一切就好辦了。我用了個取巧的方式來查看sysroot,在AS里建一個c++項目,故意寫錯一段代碼就能看到grade的log里面明確標出了使用的sysroot($NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot)這才是我們需要的。

學會看log

很多同學遇到編譯問題就只截圖終端,其實真正的log在ffbuild/conf.log,這里面詳細說明了錯在什么地方。

正確的配置

export NDK=/home/fgodt/Android/Sdk/ndk-bundle
export API=22
export ARCH=aarch64
export PLATFORM=aarch64
export TARGET=$PLATFORM-linux-android
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
#正確的sysroot
export SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
export CPU=aarch64
export PREFIX=/home/fgodt/FFmpeg/android/$CPU
export CFLAG="-D__ANDROID_API__=$API -Os -fPIC -DANDROID "

./configure \
--prefix=$PREFIX \
--cc=$TOOLCHAIN/$TARGET$API-clang \
--cxx=$TOOLCHAIN/$TARGET$API-clang++ \
--ld=$TOOLCHAIN/$TARGET$API-clang \
--target-os=android  \
--arch=$ARCH \
--cross-prefix=$TOOLCHAIN/$ARCH-linux-android- \
--disable-asm \
--enable-cross-compile \
--disable-shared \
--disable-doc \
--enable-runtime-cpudetect \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-decoders \
--disable-encoders \
--disable-devices \
--sysroot=$SYSROOT \
--extra-cflags="$CFLAG" \
--extra-ldflags=""

######################################################
#aarch64 不需要 --cpu , 如果是其他cpu請添加下面這句
#--cpu=$PLATFORM \
######################################################

注意

這里的配置只是簡單的驗證了是否通過編譯,你應該根據自己的需要裁減FFmpeg,如果需要硬件加速等功能也需要添加JNI配置和開啟MediaCodec。

至於根目錄下的sysroot有什么用我還沒有細研究,總不能憑白無故多一個sysroot吧。

最后希望對還沒編譯過的同學有用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM