28.Android Studio下FFmpeg的編譯和使用(二.Ubunto系統環境配置)
FFmpegPlayer.git" target="_blank" rel="nofollow,noindex">專案原始碼
編譯過程中涉及到很多ndk中的so庫和標頭檔案以及交叉編譯的工具,在命令執行的時候會在ndk相應的目錄下去查詢,所以我們可以使用export命令事先將這些路徑設定到環境變數,使用的時候可以很方便的找到
//NDK加入環境變數,以我的ndk存放路徑為例 export NDK=/root/renzhenming/ffmpeg/android-ndk-r14b //ndk的platforms資料夾中存放的是各個版本架構下的so庫和標頭檔案 export PLATFORM=$NDK/platforms/android-21/arch-arm //指定交叉編譯工具的路徑 export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 //指定輸出型別,以armv7-a為例 export CPU=armv7-a //指定so檔案編譯後的輸出路徑 export PREFIX=./android/$CPU
相關命令解析
指令碼中定義了一個方法build_ffmpeg,最終它被呼叫兩次生成支援neon和硬解碼的so庫和不支援neon和硬解碼的so庫
configure :是ffmpeg中已有的一個配置檔案,我們的指令碼其實也就是去執行這個檔案,所有生成so的工作都在這裡進行
prefix : 指定最終生成的so的安裝目錄
target-os : 指定目標系統,早期很多指令碼在2.x上把這個指定為linux,可以,但是ffmpeg更新之後,在3.x的版本之上會導致問題,標頭檔案找不到之類的,這是一點差異
cross-prefix:指定交叉編譯的字首,在交叉編譯的情況下,比如交叉編譯使用的gcc,那麼會在gcc前加上這個字首,就是一個完整的gcc工具的路徑,可以通過這個路徑找到這個工具(/home/renzhenming/ffmpeg/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc)
sysroot:指定這套系統依賴的庫和標頭檔案位置,就是我們配置的PLATFORMS,交叉編譯在本系統中是找不到這些庫的,可以把這些庫看作是交叉編譯的環境
extra-cflags:給gcc提供的一系列引數,這個可配可不配。 -fPIC編譯動態連結庫的引數, -mfpu指定協處理器,-mfloat-abi=softfp軟浮點
nm:符號檢視工具
enable-shared:編譯成動態庫,大概在3.4之前的ffmpeg版本,我們編譯的時候需要修改configure檔案中的一些引數,因為預設生成的so庫檔名有問題,無法直接呼叫,3.4不再需要手動修改
enable-runtime-cpudetect :開啟執行期cpu檢測,不支援的指令可以自動被替換
enable-gpl:ffmpeg要求商用中如果開啟這個gpl,那麼你的程式碼要開源,否則不準開啟,不開啟有些庫無法使用
enable-small:打出來的so更小
enable-asm:允許彙編,指令優化
支援硬解碼,開啟後jni可以呼叫java的原始碼
--enable-jni
--enable-mediacodec
解碼器
--enable-decoder=h264_mediacodec
硬體加速
--enable-hwaccel=h264_mediacodec \
完整的編譯指令碼
#!/bin/bash echo "開始編譯ffmpeg" #配置ndk的路徑 NDK=/home/renzhenming/ffmpeg/android-ndk-r14b #指定Android版本指定架構的so庫和標頭檔案 PLATFORM=$NDK/platforms/android-21/arch-arm TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 CPU=armv7-a #輸出路徑 PREFIX=./android/$CPU function build_ffmpeg { echo "開始編譯ffmpeg" ./configure \ --prefix=$PREFIX \ --target-os=android \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --arch=arm \ --cpu=$CPU\ --sysroot=$PLATFORM \ --extra-cflags="$CFLAG" \ --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \ --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \ --enable-shared \ --enable-runtime-cpudetect \ --enable-gpl \ --enable-small \ --enable-cross-compile \ --disable-debug \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-postproc \ --disable-avdevice \ --disable-symver \ --disable-stripping \ $ADD make -j16 make install echo "編譯結束!" } ########################################################### echo "編譯支援neon和硬解碼" CPU=armv7-a PREFIX=./android/armv7-a-neon-hard CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp " ADD="--enable-asm \ --enable-neon \ --enable-jni \ --enable-mediacodec \ --enable-decoder=h264_mediacodec \ --enable-hwaccel=h264_mediacodec " build_ffmpeg ########################################################### echo "編譯不支援neon和硬解碼" CPU=armv7-a PREFIX=./android/$CPU CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp " ADD= build_ffmpeg