FFmepg介紹
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開發(fā)的。
FFmpeg在Linux平臺下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負責(zé)維護。許多FFmpeg的開發(fā)人員都來自MPlayer項目,而且當(dāng)前FFmpeg也是放在MPlayer項目組的服務(wù)器上。項目的名稱來自MPEG[視頻編碼標(biāo)準]
環(huán)境搭建
這里只介紹 FFmpeg-4.0.5 與 android-ndk-r17c編譯,這里強烈建議大家ffmpeg版本與ndk版本不要隨便亂搭配,我是踩過坑的,我用ndk17去編譯ffmpeg4.2(當(dāng)時4.2是最新的版本),結(jié)果報了下面這個錯
liuyuanqideMacBook-Pro:ffmpeg-4.2 liuyuanqi$ ./configure_mybuild
開始編譯ffmpeg...
/Users/liuyuanqi/Library/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-clang is unable to create an executable file.
C compiler test failed.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "ffbuild/config.log" produced by configure as this will help
MacOS編譯FFmpeg4.0.5
第一步:下載NDK (android-ndk-r17c)
下載地址:https://developer.android.google.cn/ndk/downloads/older_releases

下載完后解壓到目錄如下(macOS目錄)
/Users/liuyuanqi/Library/Android/android-ndk-r17c
第二步:下載FFmpeg(ffmpeg-4.0.5)
下載地址:
http://ffmpeg.org/download.html#releases

下載完后解壓到目錄如下(macOS目錄)
/Users/liuyuanqi/Desktop/liuyuanqi/wangyi/Fmmpeg/ffmpeg-4.0.5
第三步:編譯FFmpeg庫(這里生成的是靜態(tài)庫.a文件)
- 1.在ffmpeg-4.0.5目錄創(chuàng)建一個文件configure_mybuild(這里跟自帶的configure文件同一級目錄即可)。
- 2.將以下腳本拷貝到configure_mybuild里
#!/bin/bash
NDK_ROOT=/Users/liuyuanqi/Library/Android/android-ndk-r17c
#TOOLCHAIN 變量指向ndk中的交叉編譯gcc所在的目錄
TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-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"
echo "編譯參數(shù)設(shè)定完成..."
#執(zhí)行configure腳本,用于生成makefile
#--prefix : 安裝目錄
#--enable-small : 優(yōu)化大小
#--disable-programs : 不編譯ffmpeg程序(命令行工具),我們是需要獲得靜態(tài)(動態(tài))庫。
#--disable-avdevice : 關(guān)閉avdevice模塊,此模塊在android中無用
#--disable-encoders : 關(guān)閉所有編碼器 (播放不需要編碼)
#--disable-muxers : 關(guān)閉所有復(fù)用器(封裝器),不需要生成mp4這樣的文件,所以關(guān)閉
#--disable-filters :關(guān)閉視頻濾鏡
#--enable-cross-compile : 開啟交叉編譯(ffmpeg比較**跨平臺**,并不是所有庫都有這么happy的選項 )
#--cross-prefix: 看右邊的值應(yīng)該就知道是干嘛的,gcc的前綴 xxx/xxx/xxx-gcc 則給xxx/xxx/xxx-
#disable-shared enable-static 不寫也可以,默認就是這樣的。
#--sysroot:
#--extra-cflags: 會傳給gcc的參數(shù)
#--arch --target-os :
echo "開始執(zhí)行configure腳本..."
PREFIX=./android/armeabi-v7a
./configure \
--prefix=$PREFIX \
--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
echo "configure腳本執(zhí)行完畢..."
echo "開始執(zhí)行make..."
make clean
make install
echo "make執(zhí)行完成..."
echo "恭喜你,編譯完成..."
- 3.執(zhí)行編譯
liuyuanqideMacBook-Pro:ffmpeg-4.0.5 liuyuanqi$ ./configure_mybuild
執(zhí)行過程如下
以上截圖是開始編譯
然后就是漫長等待(大概5分鐘左右)

當(dāng)你看到編譯完成四個字,恭喜你,編譯完成,可以去找編譯出來的靜態(tài)庫啦
*4.拷貝編譯好的靜態(tài)庫文件
編譯好的文件在 ffmpeg-4.0.5/android/armeabi-v7a/

接下來,編譯出來的庫在Android端如何調(diào)用,請看我下一篇博客
