FFMPEG填坑之旅(贰----导入libx264)

1,780 阅读1分钟

本来这一篇是给解码到播放的第一篇的,但是这两天做到了编码部分,需要编入libx264库进来,所以才来插一篇。

本节,基于序章(零)的编库,再加入了libx264的支持以及各个CPU架构的支持。

本文顺序会先说编libx264,再说支持各个架构的方式。

--------------------------------正文分割线------------------------------

编x264库其实脚本很简单,脚本如下:

#!/bin/bash
NDK=/path/to/your/ndk
PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=path/output/x264lib

function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-static \
--disable-asm \
--enable-pic \
--enable-strip \
--host=arm-linux-androideabi \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$PLATFORM \
--extra-cflags="-Os -fpic" \
--extra-ldflags="" \

$ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install

}

build_one

运行完,在对应输出目录就有了include文件和lib文件。

然后修改FFMPEG的编译脚本,如下:

#!/bin/bash
NDK=/path/to/your/ndk
SYSROOT=$NDK/platforms/android-21/arch-arm
ISYSROOT=$NDK/sysroot
ASM=$ISYSROOT/usr/include/arm-linux-androideabi
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=path/output/ffmpeg/armeabi

EXTRA_X264_CFLAGS="path/to/x264/lib/include"
EXTRA_X264_LDFLAGS="$path/to/x264/lib/lib"

function build_one
{
./configure \
    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
    --prefix=$PREFIX \
    --enable-shared \
    --disable-static \
    --disable-doc \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-avdevice \
    --disable-symver \
    --enable-nonfree \
    --disable-securetransport \
    --enable-gpl \
    --enable-libx264 \
    --cross-prefix=$CROSS_PREFIX \
    --target-os=android \
    --arch=arm \
    --enable-cross-compile \
    --sysroot=$SYSROOT \
    --extra-cflags="-I$ASM -isysroot $ISYSROOT  -Os -fpic -I$EXTRA_X264_CFLAGS" \
    --extra-ldflags="-L$EXTRA_X264_LDFLAGS"

    make clean
    make 
    make install
}

cd ../../../ffmpeg
build_one
cd ../so/build_script/ffmpeg

编完在对应目录就能找到包含x264库的ffmpeg库了。

足够简单。

然后,就来到多CPU架构了。

嫌麻烦就是多写几个脚本,复制粘贴,修改编译的属性就好

PLATFORM=$NDK/platforms/android-21/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
...
--host=arm-linux-androideabi \

就这几条替换成对应的CPU属性就好了,继续编译就好了,如果嫌每次要切路径很麻烦,再多些点脚本去执行这些脚本就好了。

很简单。

但是在编x264 arm64-v8a 这个版本的时候,出了点意外。

libx264.a(bitstream-8.o): In function `x264_8_bitstream_init':
bitstream.c:(.text+0x19c): undefined reference to `x264_8_nal_escape_neon'
...

报了这个错误,Google大爷说得是neon不支持64位。但是,不应该啊!!! 试了很多方法,都无解,最后在configure加了条属性 --enable-asm。就解决了!就解决了!就解决了!

无奈(摊手)