準備工作--ffmpeg編譯

為了能更好的學習和運用ffmpeg, 建議下載ffmpeg源碼自己編譯.這里的編譯方法基于ubuntu16.04環境.直接按照編譯FFmpeg來做可能會碰到一些錯誤, 我將自己編譯碰到的錯誤記錄在最后面. 我自己編譯的工程已經傳到github上
https://github.com/yizhongliu/ffmpegForAndroid

下載ndk,配置ndk環境

https://developer.android.google.cn/ndk/downloads/
export ANDROID_NDK=/home/llm/Android/android-ndk-r19c-linux-x86_64/android-ndk-r17c/

這里建議使用android-ndk-r17c版本

下載ffmpeg源碼

FFmpeg官網下載最新4.1.3壓縮文件
將下載的文件拷貝至合適的文件夾
在該目錄下執行tar -jxvf ffmpeg-4.1.3.tar.bz2(請注意自己的版本和壓縮格式)

編譯FFmpeg

1 修改 ./configure 文件,該文件影響編譯后so文件的命名,默認的命名在Android上會出現問題, 修改后生成以lib為前綴,.so為后置的name

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'  
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'  
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'  
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

替換成

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'  
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'  
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'  
SLIB_INSTALL_LINKS='$(SLIBNAME)'

2 新建可執行文件,在根目錄下新建 build_android.sh,我的環境文件內容如下:

#!/bin/sh

MY_LIBS_NAME=ffmpeg-4.0
MY_DIR=ffmpeg-4.0

# cd ./${MY_DIR}

#編譯的過程中產生的中間件的存放目錄,為了區分編譯目錄,源碼目錄,install目錄
MY_BUILD_DIR=binary


NDK_PATH=/home/llm/Android/android-ndk-r17c
BUILD_PLATFORM=linux-x86_64
TOOLCHAIN_VERSION=4.9
ANDROID_VERSION=21

ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"  #-mfloat-abi=hard -mfpu=vfpv3-d16 #-mfloat-abi=hard -mfpu=vfp
ANDROID_ARMV8_CFLAGS="-march=armv8-a"
ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"


# params($1:arch,$2:arch_abi,$3:host,$4:cross_prefix,$5:cflags)
build_bin() {

    echo "-------------------star build $2-------------------------"

    ARCH=$1         # arm arm64 x86 x86_64
    ANDROID_ARCH_ABI=$2     # armeabi armeabi-v7a x86 mips

    PREFIX=$(pwd)/dist/${MY_LIBS_NAME}/${ANDROID_ARCH_ABI}/

    HOST=$3
    SYSROOT=${NDK_PATH}/platforms/android-${ANDROID_VERSION}/arch-${ARCH}

    CFALGS=$5


    TOOLCHAIN=${NDK_PATH}/toolchains/${HOST}-${TOOLCHAIN_VERSION}/prebuilt/${BUILD_PLATFORM}
    CROSS_PREFIX=${TOOLCHAIN}/bin/$4-

    # build 中間件
    BUILD_DIR=./${MY_BUILD_DIR}/${ANDROID_ARCH_ABI}

    echo "pwd==$(pwd)"
    echo "ARCH==${ARCH}"
    echo "PREFIX==${PREFIX}"
    echo "HOST==${HOST}"
    echo "SYSROOT=${SYSROOT}"
    echo "CFALGS=$5"
    echo "CFALGS=${CFALGS}"
    echo "TOOLCHAIN==${TOOLCHAIN}"
    echo "CROSS_PREFIX=${CROSS_PREFIX}"

    #echo "-------------------------按任意鍵繼續---------------------"
    #read -n 1
    #echo "-------------------------繼續執行-------------------------"

    mkdir -p ${BUILD_DIR}   #創建當前arch_abi的編譯目錄,比如:binary/armeabi-v7a
    #cd ${BUILD_DIR}         #此處 進了當前arch_abi的2級編譯目錄


    ./configure \
         --prefix=${PREFIX} \
         --target-os=linux \
         --arch=${ARCH} \
         --sysroot=$SYSROOT \
         --enable-cross-compile \
         --cross-prefix=${CROSS_PREFIX} \
         --extra-cflags="-I$NDK_PATH/sysroot/usr/include/$4 -isysroot $NDK_PATH/sysroot $CFALGS -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
         --extra-cxxflags="-D__thumb__ -fexceptions -frtti" \
         --extra-ldflags="-L${SYSROOT}/usr/lib" \
         --enable-shared \
         --enable-asm \
         --enable-neon \
         --disable-encoders \
         --enable-encoder=aac \
         --enable-encoder=mjpeg \
         --enable-encoder=png \
         --enable-encoder=mpeg4 \
         --disable-decoders \
         --enable-decoder=aac \
         --enable-decoder=aac_latm \
         --enable-decoder=h264 \
         --enable-decoder=mpeg4 \
         --enable-decoder=mjpeg \
         --enable-decoder=png \
         --disable-demuxers \
         --enable-demuxer=image2 \
         --enable-demuxer=h264 \
         --enable-demuxer=aac \
                 --enable-demuxer=mpegvideo \
                 --enable-demuxer=avi \
                 --enable-demuxer=mov \
         --disable-parsers \
         --enable-parser=aac \
         --enable-parser=ac3 \
         --enable-parser=h264 \
                 --enable-parser=mpeg4video \
                 --enable-parser=mjpeg \
         --enable-gpl \
         --disable-doc \
         --disable-ffmpeg \
         --disable-ffplay \
         --disable-ffprobe \
         --disable-symver \
         --disable-debug \
         --enable-small


    make clean
    make
    make install

    #從當前arch_abi編譯目錄跳出,對應上面的cd ${BUILD_DIR},以便function多次執行
        cd ../../

    echo "-------------------$2 build end-------------------------"
}


# build armeabi
#build_bin arm armeabi arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV5_CFLAGS"

#build armeabi-v7a
#build_bin arm armeabi-v7a arm-linux-androideabi arm-linux-androideabi "$ANDROID_ARMV7_CFLAGS"

#build arm64-v8a
build_bin arm64 arm64-v8a aarch64-linux-android aarch64-linux-android "$ANDROID_ARMV8_CFLAGS"

#build x86
#build_bin x86 x86 x86 i686-linux-android "$ANDROID_X86_CFLAGS"

#build x86_64
#build_bin x86_64 x86_64 x86_64 x86_64-linux-android "$ANDROID_X86_64_CFLAGS"

3 chmod 777 build_android.sh
4 ./build_android.sh

熟悉開源C/C++代碼的人應該會了解,一般都采用automake的方式來編譯軟件, 編譯的步驟都是

./configure  //配置環境
./make   //編譯
./make install   //安裝

上面的sh最后編譯了arm64-v8a的so, 需要編譯其他arch, 將對應的#build 打開

編譯ffmpeg錯誤記錄

錯誤1:
找不到文件/home/llm/Android/android-ndk-r19c-linux-x86_64/android-ndk-r19c/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc
原因:
Android NDK放棄GCC,全面轉向Clang.詳細解釋參考https://chuansongme.com/n/2251372
解決:
改用android-ndk-r17c

錯誤2:
/home/llm/Android/android-ndk-r17c-linux-x86_64/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/include/stdint.h:9:26: fatal error: stdint.h: No such file or directory #include_next <stdint.h>
原因:
NDK r17c版本將頭文件和庫文件進行了分離,我們指定的sysroot文件夾下只有庫文件,而頭文件放在了NDK目錄下的sysroot內.
解決:
需在build_android.sh文件 –extra-cflags中添加 “-isysroot $NDK/sysroot”

錯誤3:

libavcodec/aaccoder.c: In function 'search_for_ms':
libavcodec/aaccoder.c:803:25: error: expected identifier or '(' before numeric constant
                     int B0 = 0, B1 = 0;
                         ^
compilation terminated due to -Wfatal-errors.

ibavcodec/hevc_mvs.c: In function 'derive_spatial_merge_candidates':
libavcodec/hevc_mvs.c:208:15: error: 'y0000000' undeclared (first use in this function)
             ((y ## v) >> s->ps.sps->log2_min_pu_size))
               ^

原因:
由于定義沖突導致的一個error,和ndk版本有關
解決:
修改libavcodec/aaccoder.c 文件 B0改成b0(ps:就是把int型變量名改一下,避免沖突,名字隨便起).其他文件也可能報這個錯誤,按同樣的方法修改

錯誤4:

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容