最近項目中需要ffmpeg來操作h264流,然而ffmpeg並沒有並沒有集成h264編碼器,需要引入libx264,所以在電腦上重新編譯了ffmpeg以及h264,真是一路踩坑的過程,中間遇到很多莫名的錯誤,在此記錄下,希望後來看到的你,能順利編譯。
首先編譯h264,首先從官網下載h264源碼,http://download.videolan.org/pub/videolan/x264/snapshots/ 也可以用git下載
解壓之後在h264目錄下新建build_x264.sh可以執行文件,如下
#!/bin/bash
NDK=/Users/qss/Documents/adt-bundle-mac-x86_64-20140702/sdk/ndk-bundle
#NDK= 換成自己的ndk主目錄
SYSROOT=$NDK/platforms/android-15/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
bash ./configure \
--prefix=$PREFIX \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--sysroot="$SYSROOT" \
--host=arm-linux \
--enable-pic \
--enable-shared \
--enable-static \
--disable-cli
make
make install
}
CPU=arm
PREFIX=/usr/local
build_one
NDK、SYSROOT、TOOLCHAIN要寫成自己對應的目錄,否則編譯的時候找不到相關文件
移動到x264目錄下
添加可執行權限:sudo chmod +x build_x264.sh
開始執行./build_x264.sh
最後一步可能出現權限錯誤,然後sudo make install,然後輸入密碼,即可。
編譯成功後切換到 /usr/local目錄下會看到include 和lib兩個文件夾,爲輸出對應文件夾
說下中間的坑,執行./build_x264.sh的時候報錯
Makefile:3: config.mak: No such file or directory
cat: config.h: No such file or directory
./configure
Found no assembler
Minimum version is nasm-2.13
If you really want to compile without asm, configure with --disable-asm.
make: *** [config.mak] Error 1
上面提示是nasm版本太低或者關閉--disable-asm. 我首先想到的是關閉--disable-asm.配置,然而,關閉配置之後依然報這個錯誤,只能把nasm升級,升級就是先安裝Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
直接終端複製安裝,經過漫長的等待,homebrew安裝完成,接下來安裝nasm
brew install nasm
然後在繼續執行我們之前的命令:
./build_x264.sh
此時沒有意外的話,執行成功,在usr/local下的lib和include中會多出很多文件,這就是編譯好的h264文件
接下來編譯ffmpeg,依然是下載ffmpeg源碼,我下載的是最新的4.2.2的源碼,下載完成之後,在ffmpeg目錄下新建一個build_android.sh可執行文件,內容如下:
#!/bin/sh
NDK=/Users/qss/Documents/adt-bundle-mac-x86_64-20140702/sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--enable-gpl \
--enable-libx264 \
--enable-protocols \
--enable-muxer=mp4 \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic -I/usr/local/include $ADDI_CFLAGS" \
--extra-ldflags="-L/usr/local/lib $ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=/Users/qss/Desktop
ADDI_CFLAGS="-marm"
build_one
NDK、SYSROOT、TOOLCHAIN、依然是填寫自己的文件路徑
移動到FFmpeg目錄下
添加可執行權限:sudo chmod +x build_android.sh
開始執行./build_android.sh
最後一步可能出現權限錯誤,然後sudo make install,然後輸入密碼,即可。
編譯成功後切換到 /usr/local目錄中的include 和lib兩個文件夾裏會多出文件,爲輸出對應文件。
執行./build_android.sh的時候報錯信息:
Unknown option "--disable-ffserver".
See ./configure --help for available options.
大概意思是要設置 --disable-ffserver
這是因爲要經過configure編譯,如果不經過編譯,就會報上面的錯誤
./configure 編譯,然後繼續命令操作:
./build_android.sh
發生瞭如下錯誤:
/bin/sh: ranlib/usr/local/lib/libavdevice.a: No such file or directory
make: *** [install-libavdevice-static] Error 127