更新:
最近在做摄像头画面H.264编码,拿起MediaCodec咔咔一顿写,抱着一遍过的心态,然后果不其然的直接崩了,看了错误日志才发现,我的手机没有H.264的编码器,然后查了一下才发现,不同设备对MediaCodec硬编的支持参差不齐,于是索性换成软编,然后想起了FFmpeg,这次有了前车之鉴,先查了一下,发现FFmpeg默认没有集成这个编码器,需要引入libx264,好吧,革命事业曲折离奇,然后又是一顿踩坑之后,有了下面这段更新。
- 编译libx264
git clone git://git.videolan.org/x264.git
直接克隆下来,省时省力,然后进入文件目录下,创建待会儿要使用的shell脚本,如下:
#!/bin/bash
export NDK=/home/download/android-ndk-r15c
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=/usr/local/x264
export ADDI_CFLAGS="-marm"
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-static \
--disable-gpac \
--disable-cli \
--disable-asm \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--host=arm-linux \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make j8
make install
这个脚本和下面编译FFmpeg的脚本非常类似,主要一定要加入跨平台编译,不然编译出来的so文件是64位的,在android armeabi-v7a上没法使用。下面是重头戏,也是在整个编译过程中一直困扰我的,就是在编译过程中经常出现一个log2f,起初没注意,每次编译到这儿就会停顿一下,后面混编的时候一直找不到libx264也是这个原因(这是libx264 not found的一个隐藏得比较深的原因,还可能是其他原因)。我们需要把libx264文件夹下的config.h里面的#define HAVE_LOG2F 1关闭,也就是修改成:
#define HAVE_LOG2F 0
这下再make也就不会出现log2f了。
- FFmpeg+libx264混编
混编也就是在下面编译FFmpeg的脚本中开启libx264,以及告诉FFmpeg,libx264的so文件和头文件的位置。直接给出来,并标出不同的地方:
#!/bin/bash
export NDK=/home/download/android-ndk-r15c
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
export PREFIX=/usr/local/ffmpeg/
# 下面这两句就是告诉FFmpeg x264相关文件的位置
export ADDI_CFLAGS="-I/usr/local/x264/include"
export ADDI_LDFLAGS="-L/usr/local/x264/lib"
./configure --target-os=android \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-x86asm \
--disable-symver \
--enable-gpl \
# 开启libx264
--enable-libx264 \
--enable-encoder=libx264 \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--en