1. 程式人生 > >FFMpeg 4.0.2編譯

FFMpeg 4.0.2編譯

因為專案需要,需要加入視訊相關的功能,那必然繞不開FFMpeg了,所以本文記錄一下在在編譯FFMpeg中的經驗和教訓。

本篇將介紹2種環境下的編譯方式:MacOS和Windows使用NDK r16b + FFMpeg 4.0.2,下載地址可以百度一下。這裡就不累贅了

先以MacOS為例(因為網上很多例子都是Mac下的,而我剛開始用的windows,導致出現了很低階的錯誤,但是一直找不到原因)。

1:下載NDK,然後解壓 android-ndk-r16b,配置NDK環境變數

開啟終端輸入 pico ~/.bash_profile

然後新增以下程式碼

export NDK_ROOT=/Users/zhaobo/Downloads/android-ndk-r16b  #這裡替換成你的ndk路徑

export PATH=$PATH:$NDK_ROOT

然後control+x 然後選擇Y enter儲存

然後需要更新環境變數 source ~/.bash_profile

驗證是否配置正確,在終端裡輸入ndk-build,如果出現的不是command not found,說明配置成功了。

2:進入第二步,編譯ffmpeg

在編譯以前還需要做2件事情,1:修改configue檔案;2:製作build_android.sh檔案。

2.1修改configure檔案,configure檔案位於ffmpeg的根目錄下,用文字編譯器打卡,找到build settings

將下面四行

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.2 製作build_android.sh檔案

在ffmpeg的根目錄下建立一個build_android.sh檔案,可以在ffmpeg的目錄裡找一個.sh檔案,拿來改動。以下是我的build檔案,這些路徑一定要仔細檢查,90%的問題都來自路徑的配置

#!/bin/bash
ADDI_CFLAGS="-marm"
API=27 #這個需要根據自己的ndk版本進行修改,確保自己的ndk下有android-27
PLATFORM=arm-linux-androideabi
CPU=armv7-a
NDK=/Users/zhaobo/Downloads/android-ndk-r16b # 修改成自己本地的ndk路徑
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/darwin-x86_64 #這個路徑非常關鍵,windows下是windows-x86_64
OUTPUT=/Users/zhaobo/Downloads/ffmpeg-4.0.2/android/output #自己指定一個輸出目錄,這個要提前手動建立好
function build_one
{
./configure \
--prefix=$OUTPUT \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
--extra-ldflags="-marm" \
$ADDITIONAL_CONFIGURE_FLAG
  make clean
  make 
  make install
}
echo "開始編譯ffmpeg..."
build_one
echo "完成編譯..."

儲存

2.3編譯

開啟終端,首先cd C:/Workspace/Project/ffmpeg-4.0.2

然後./build_android.sh

接下來就是漫長的等待

備註:如果在終端中執行命令時,提示permission deny,就需要加許可權 chmod 777 要執行的檔案,如:chmod 777 ./build_android.sh, 然後再 ./build_android.sh

下面是windows下的編譯步驟,和mac下大同小異。

1: 下載ndk和ffmpeg,然後配置ndk的環境變數,驗證ndk環境變數是否配置成功,同樣在命令列下輸入 ndk-build

2:因為ndk編譯需要linux環境,所以在windows下還需要下載安裝MinGW,配置環境變數

3: 編譯ffmpeg

3.1 修改 ffmpeg下的configure和上面mac下的方式一樣

3.2 建立build_android.sh

#!/bin/bash
ADDI_CFLAGS="-marm"
API=27
PLATFORM=arm-linux-androideabi
CPU=armv7-a
NDK=C:/Workspace/SDK/ndk-bundle # 修改自己本地的ndk路徑
SYSROOT=$NDK/platforms/android-$API/arch-arm/
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/$PLATFORM
TOOLCHAIN=$NDK/toolchains/$PLATFORM-4.9/prebuilt/windows-x86_64  #注意這裡,一定是windows-xxx,我就是因為這個一直編譯不過
OUTPUT=C:/Workspace/Project/ffmpeg-4.0.2/android/output #自己指定一個輸出目錄,提前手動建好
function build_one
{
./configure \
--prefix=$OUTPUT \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=android \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-I$ASM -isysroot $ISYSROOT -Os -fpic -marm" \
--extra-ldflags="-marm" \
$ADDITIONAL_CONFIGURE_FLAG
  make clean
  make 
  make install
}
echo "開始編譯ffmpeg..."
build_one
echo "完成編譯..."

儲存,編譯

雙擊開啟MinGW下的\msys\1.0\msys.bat,然後和mac下的編譯一樣,

首先cd C:/Workspace/Project/ffmpeg-4.0.2

chmod 777 build_android.sh

build_android.sh

接著又是漫長的等待。

備註:windows下的路徑"\" 在linux下需要換成"/"