【ffmpeg】Linux編譯供ffmpeg供Android使用
阿新 • • 發佈:2018-12-09
-
準備工作
1.搭建Linux伺服器,如果不會搭建,可以買一個阿里雲伺服器,便宜的50來塊錢,這個過程就省略了。
3.下載ndk到伺服器,下載ffmpeg到伺服器,過程如下:
ndk:
如果出現報錯,使用更新命令:sudo apt-get update ,然後在執行解壓縮命令。
完成後
ffmpgeg:
和上面步驟大概相同:下載+解壓。
為了乾淨一點兒,這裡建立一個資料夾ffmpeg:mkdir ffmpeg
進入ffmpeg資料夾操作:cd /ffmpeg
解壓縮:tar xvf ffmpeg-4.0.2.tar.bz2
完成後
-
編譯工作
進入ffmpeg-4.0.2:cd ffmpeg-4.0.2/
建立一個shell檔案:vim ffmpeg.sh
按i,進入編輯模式,內容如下:
#!/bin/bash #ndk根目錄(很多命令都重複用到,所以設定一個變數,好看一些) NDK_ROOT=/root/android-ndk-r16b #TOOLCHAIN 變數指向ndk中的交叉編譯gcc所在的目錄 TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 #FLAGS與INCLUDES變數 可以從AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷貝,需要注意的是**地址** FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC" INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include" #編譯完成後庫和標頭檔案的存放目錄 PREFIX=./android/armeabi-v7a2 #執行configure指令碼,用於生成makefile #--prefix : 安裝目錄 #--enable-small : 優化大小 #--disable-programs : 不編譯ffmpeg程式(命令列工具),我們是需要獲得靜態(動態)庫。 #--disable-avdevice : 關閉avdevice模組,此模組在android中無用 #--disable-encoders : 關閉所有編碼器 (播放不需要編碼) #--disable-muxers : 關閉所有複用器(封裝器),不需要生成mp4這樣的檔案,所以關閉 #--disable-filters :關閉視訊濾鏡 #--enable-cross-compile : 開啟交叉編譯(ffmpeg比較**跨平臺**,並不是所有庫都有這麼happy的選項 ) #--cross-prefix: 看右邊的值應該就知道是幹嘛的,gcc的字首 xxx/xxx/xxx-gcc 則給xxx/xxx/xxx- #disable-shared enable-static 不寫也可以,預設就是這樣的。 #--sysroot: #--extra-cflags: 會傳給gcc的引數 #--arch --target-os : 不給不行 ./configure \ --prefix=$PREFIX \ --enable-small \ --disable-programs \ --disable-avdevice \ --disable-encoders \ --disable-muxers \ --disable-filters \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --disable-shared \ --enable-static \ --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ --extra-cflags="$FLAGS $INCLUDES" \ --extra-cflags="-isysroot $NDK_ROOT/sysroot" \ --arch=arm \ --target-os=android make clean make install
按Esc,退出編輯模式,然後退出並儲存::wq!
編譯成功後,進入目錄看一下:cd android/armeabi-v7a2/
將生成的庫和標頭檔案匯出到windows:rz
-
建立Android專案(注意勾選包含c++)
匯入剛剛生成的庫和標頭檔案
gradle檔案中這樣:(CMakeList檔案中匯入靜態庫要用到這個引數)
CMakeList檔案中這樣:
#匯入標頭檔案 include_directories(src/main/cpp/include) #匯入靜態庫 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/cpp/libs/${ANDROID_ABI}") target_link_libraries( native-lib avcodec avfilter avformat avutil swresample swscale log )
同步一下,執行Android專案
編譯ffmpeg並匯入Android專案,成功了。如有疑問+Q:846462358(答案:Biligle)