x264 交叉编译

2,160 阅读1分钟

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 来看。