x264 是一个C语言编写的目前对 H.264 标准支持最完善的编解码库,可以集成到 FFMpeg。
x264 交叉编译
首先下载 x264 源码。
git clone https://code.videolan.org/videolan/x264.git
下载完源码后来看看目录结构,这是一个老套路。一般的 C/C++ 开源项目都会包含者 configure 脚本。
可以使用命令将 configure 命令打印到文件中方面查看。
./configure --help >> x264_help.txt
可以看到它都有一些命令介绍,告诉我们选择那些可用选项。
OK!下面给出我在 Mac 下的编译脚本吧!
TOOLCHAIN= 独立工具链生成目录,对编译工具链不清楚的请看我的 NDK 交叉编译工具链使用 文章.
export PATH=$PATH:$TOOLCHAIN/bin
target_host=arm-linux-androideabi
export AR=$target_host-ar
export AS=$taret_host-clang
export CC=$target_host-clang
export LD=$target_host-ld
export STRIP=$target_host-strip
# 安装路径
PREFIX=./android/armeabi-v7a
# 编译目标平台版本
ANDROID_API=21
./configure \
--enable-static \
--enable-pic \
--disable-cli \
--prefix=$PREFIX \
--cross-prefix=$target_host- \
--sysroot=$TOOLCHAIN/sysroot \
--extra-cflags="-isysroot $TOOLCHAIN/sysroot -isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=$ANDROID_API -U_FILE_OFFSET_BITS" \
--host=arm-linux \
make clean
make -j4
make install
如果没有执行权限,使用下面的方式获取
chomod +x build_armeabi.sh
./build_armeabi.sh
生成的目录如下, 这里生成 arm32 和 64 位的,如果你能编译 32 的,想必 64 你也知道如何编译,就是改一下编译工具链。
Android 集成 x264
将其拷贝到工程,目录如下
CMakeLists.txt 配置文件如下
cmake_minimum_required(VERSION 3.4.1)
include_directories(${CMAKE_SOURCE_DIR}/include/librtmp)
include_directories(${CMAKE_SOURCE_DIR}/include/x264)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}")
add_library(
native-lib
SHARED
native-lib.cpp
)
target_link_libraries(
native-lib
log
rtmp
x264
)
JNI 函数
#include <jni.h>
#include <string>
#include <rtmp.h>
#include <x264.h>
extern "C" JNIEXPORT jstring JNICALL
Java_com_hxj_rtmpdumpdemo_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
char version[100];
sprintf(version, "rtmpdump version: %d", RTMP_LibVersion());
x264_picture_t *pic = new x264_picture_t;
x264_picture_init(pic);
return env->NewStringUTF(version);
}
注意: 由于这里 x264 结合了 RTMPDump 库,所以读者可以结合我的另一篇 RTMPDump 来看。