最近项目中需要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