X264作为H264视频编码最好用的有损视频软编码器之一,其性能比FFmpeg中实现的内置编码算法性能更好,其功能强大无以言表。但遗憾的是只能编码为H264,无法编码为H265等其他视频编码格式,本章主要实现通过使用X264源码编译出android中可以使用的X264编码器。
一、下载
X264官网地址:https://www.videolan.org/developers/x264.html
这里使用ubuntu命令行下载
1. 因为x264是使用git来管理的,所以如果没有安装git工具的,需要先安装git,命令如下
sudo apt-get install git
2. 获取x264包
git clone https://code.videolan.org/videolan/x264.git
二、编译
1.执行cd x264打开文件夹
2.执行configure --help查看可配置项,如下
Standard options:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
--bindir=DIR install binaries in DIR [EPREFIX/bin]
--libdir=DIR install libs in DIR [EPREFIX/lib]
--includedir=DIR install includes in DIR [PREFIX/include]
--extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS
--extra-cflags=ECFLAGS add ECFLAGS to CFLAGS
--extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS
--extra-rcflags=ERCFLAGS add ERCFLAGS to RCFLAGS
Configuration options:
--disable-cli disable cli
--system-libx264 use system libx264 instead of internal
--enable-shared build shared library
--enable-static build static library
--disable-bashcompletion disable installation of bash-completion script
--enable-bashcompletion force installation of bash-completion script
--bashcompletionsdir=DIR install bash-completion script in DIR [auto]
--disable-opencl disable OpenCL features
--disable-gpl disable GPL-only features
--disable-thread disable multithreaded encoding
--disable-win32thread disable win32threads (windows only)
--disable-interlaced disable interlaced encoding support
--bit-depth=BIT_DEPTH set output bit depth (8, 10, all) [all]
--chroma-format=FORMAT output chroma format (400, 420, 422, 444, all) [all]
Advanced options:
--disable-asm disable platform-specific assembly optimizations
--enable-lto enable link-time optimization
--enable-debug add -g
--enable-gprof add -pg
--enable-strip add -s
--enable-pic build position-independent code
Cross-compilation:
--host=HOST build programs to run on HOST
--cross-prefix=PREFIX use PREFIX for compilation tools
--sysroot=SYSROOT root of cross-build tree
External library support:
--disable-avs disable avisynth support
--disable-swscale disable swscale support
--disable-lavf disable libavformat support
--disable-ffms disable ffmpegsource support
--disable-gpac disable gpac support
--disable-lsmash disable lsmash support
其中:
--prefix 设置编译结果输出目录,一般规范都会存在这个参数
--exec-prefix 参数表示我们可以借助这个对编译器(gcc/clang)设置选项 (类似javac设置-classpath)
--disable-cli 这个配置是关闭编译敲命令行工具,在Android是自己编译代码,用不到,也可以不管,倒库的是后不用就好
--enable-shared & --enable-static 这两个参数是指我们编译成静态库.a 还是动态库.so
--enable-pic 压制警告,在android中如果不压制警告,编译时没问题,运行时一旦产生警告会导致程序崩溃
--host 运行平台(armabi-v7a、armabi-v8a等)
--cross-prefix 工具编译链
--sysroot 为编译时指定了逻辑目录
(备:这里解释一下动态库和静态库的区别:
_1.静态库(可以理解为组件化,打包的时候必须在一起):
xxxx.c 生成xxxx.a 里面函数
编译时,从xxxx.a 中找到这个函数,与xxxx.c 一起生成一个 a.so
最终 可能 .a 库 10M
_2.动态库(可以理解为插件化,需要的时候去下载):
xxxx.a 生成xxxx.so 里面函数
编译时,只会找有没有这个函数,有就行不做其他操作
运行时,当a.so 执行到这个函数,在动态去找对应的函数
最终,会有两个so .so 6M a.so 5M. 加起来会稍微大一点)
言归正传,这里由于配置命令较长,为防止命令敲错重复修改麻烦,我写一个脚本用来执行
3.执行sudo vim generate.sh创建编辑脚本文件,并编辑如下内容,编辑完成保存(注:文件中换行前需使用\转义,否则命令行会当作回车执行命令)
如果还没有下载NDK,请参考上一章先下载NDK,并配置交叉编译环境变量,否则无法使用
#!/bin/bash
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export API=22
function build
{
./configure \
--prefix=$PREFIX \
--disable-cli \
--enable-static \
--enable-pic \
--host=$HOST \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
make clean
make -j8
make install
}
#armeabi-v7a
PREFIX=./armeabi-v7a
HOST=armv7a-linux-android
export TARGET=armv7a-linux-androideabi
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
build
如需要编译arm64-v8a架构版本,则修改以下变量:
#arm64-v8a
PREFIX=./android/arm64-v8a
HOST=aarch64-linux-android
export TARGET=aarch64-linux-android
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
4.执行./generate.sh命令,如果执行成功,会在目录下生成对应prefix的目录,如:armeabi-v7a目录
注:这里遇到了一个坑,花了我大半天的时间解决,运行脚本的时候总是提示No working C compiler found,这里要注意两点:
_1.确保NDK路径已经配置环境变量和已经重载配置的环境变量,且路径地址准确
_2.确保脚本中API=xx的值与所下载的NDK版本对应
如果保证了这两项都没错,还是报错的话,打开x264的config.log文件,里面有报错的详细信息,可供参考
5.打开armeabi-v7a目录,里面会出现include和lib目录,include文件夹中存放生成的x264的头文件,lib文件夹中存放x264的.a或.so文件,到此,x264视频编码库编码完成,在安卓中使用时,直接拷贝armeabi-v7a即可
本章内容介绍结束。