背景
时间:2024.09.23
因为项目中需要给视频加水印,项目工程中已经集成了 ijkplayer,所以想用 ffmpeg
做添加水印处理。ijkplayer 默认是有 H264 解码器,当尝试对AVFrame
进行编码操作时,提示一直找不到对应的编码器,encoder = avcodec_find_encoder(dec_ctx->codec_id);
,因此需要我们自己集成(h264)编码器到 ffmpeg 中。
解决方案
- 下载 x264源码进行编译。
- 修改 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…。
编译好的目录大概是这样:
- 修改 ijkplayer 编译脚本, 需要改两处脚本文件。分别是 ios 目录下的
compile-ffmpeg.sh
文件,和tools文件夹下的do-compile-ffmpeg.sh
- 将编译好的
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