ijkplayer(iOS)集成 H264 编码器

667 阅读2分钟

背景

时间:2024.09.23

因为项目中需要给视频加水印,项目工程中已经集成了 ijkplayer,所以想用 ffmpeg 做添加水印处理。ijkplayer 默认是有 H264 解码器,当尝试对AVFrame进行编码操作时,提示一直找不到对应的编码器,encoder = avcodec_find_encoder(dec_ctx->codec_id); ,因此需要我们自己集成(h264)编码器到 ffmpeg 中。

解决方案

  1. 下载 x264源码进行编译。
  2. 修改 ffmpeg 编译配置文件,开启 h264编码。

解决过程

1.编译x264,我用的版本是 x264-snapshot-20191217-2245.tar.bz2,下载解压到本地,源码的文件夹要改为x264,因为编译的脚本是写死的目录。

下载编译 x264 编译脚本 (github.com/kewlbear/x2…

将脚本和源码放在同一级目录,编译需要依赖nasm 环境,可以通过brew install nasm 安装一下。

具体操作流程可以参考这篇文章www.jianshu.com/p/ce67fed1c…

编译好的目录大概是这样:

image-20240923160134274.png

  1. 修改 ijkplayer 编译脚本, 需要改两处脚本文件。分别是 ios 目录下的compile-ffmpeg.sh 文件,和tools文件夹下的do-compile-ffmpeg.sh
  2. 将编译好的x264头文件和 lib 放入到 build目录下,并将 x264文件夹改为 x264-arm64(我只编了 arm64架构的)。

修改compile-ffmpeg.sh文件,首先仿照开启ssl的方式,添加 x264库。

X264_LIBS="libx264"
do_lipo_x264() {
    LIB_FILE=$1
    LIPO_FLAGS=
    for ARCH in $FF_ALL_ARCHS
    do
    #这个路径就是编译好 x264lib 的路径,$ARCH 是 arm64
    ARCH_LIB_FILE="$UNI_BUILD_ROOT/build/x264-$ARCH/output/lib/$LIB_FILE"
    if [ -f "$ARCH_LIB_FILE" ]; then
    LIPO_FLAGS="$LIPO_FLAGS $ARCH_LIB_FILE"
    
    else
    echo "skip $LIB_FILE of $ARCH";
    fi
    done
    
    if [ "$LIPO_FLAGS" != "" ]; then
        xcrun lipo -create $LIPO_FLAGS -output $UNI_BUILD_ROOT/build/universal/lib/$LIB_FILE
        xcrun lipo -info $UNI_BUILD_ROOT/build/universal/lib/$LIB_FILE
    fi
}
​

然后在 do_lipo_all 方法中,添加x264 的执行

for X264_LIB in $X264_LIBS
do
    do_lipo_x264 "$X264_LIB.a";
done

再修改 tools 文件夹下的 do-compile-ffmpeg.sh文件。还是仿照 ssl 的方式,搜索--enable-openssl关键代码,将 h264 的代码写到该方法下面。

FFMPEG_DEP_X264_INC=$FF_BUILD_ROOT/build/x264-arm64/output/include
FFMPEG_DEP_X264_LIB=$FF_BUILD_ROOT/build/x264-arm64/output/lib
​
if [ -f "${FFMPEG_DEP_X264_LIB}/libx264.a" ]; then
    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS --enable-libx264"
    FFMPEG_CFG_FLAGS="$FFMPEG_CFG_FLAGS --enable-encoder=libx264"
    FFMPEG_CFLAGS="$FFMPEG_CFLAGS -I${FFMPEG_DEP_X264_INC}"
    FFMPEG_DEP_LIBS="$FFMPEG_DEP_LIBS -L${FFMPEG_DEP_X264_LIB} -lx264"
​
fi

最后修改 config文件夹下 module-lite.sh 文件,修改配置进行重新编译。

# 开启 h264编码
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-gpl"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-libx264"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-encoder=libx264"
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-nonfree"

在编译的时候,可能会报x264_bit_depth 找不到的错误。可以将编译好的x264,在 include目录下将 x264_config.h,文件添加一个宏定义,这样就可以编译通过了。

#define x264_bit_depth     0