FFmpeg 编译使用 ffmpeg-gl-transition 以丰富视频特效
引言
FFmpeg 是一个功能强大的开源多媒体处理库,支持集成 GL Transitions【1】。通过这种集成,可以在命令行中为视频添加炫酷的转场效果。本文介绍如何在 Mac 系统上编译支持 GL Transitions 的 FFmpeg,并解决可能遇到的问题。
1. Mac 系统下编译
安装依赖库
按照 FFmpeg 官方编译文档,先安装一些必要的依赖库:
brew install automake fdk-aac git lame libass libtool libvorbis libvpx \
opus sdl shtool texi2html theora wget x264 x265 xvid nasm
安装 GLEW 和 GLFW3
文档中建议使用 Homebrew 安装 GLEW 和 GLFW:
brew install glew glfw
虽然该命令可以安装成功,但在后续编译 FFmpeg 时可能会提示找不到 GLEW 库。可行的方案是从源码编译 GLEW 和 GLFW3。
从源码编译 GLEW
从 GLEW 官网 下载源码,然后执行以下命令:
cd glew/build
cmake ./cmake
make -j4
sudo make install
从源码编译 GLFW3
从 GLFW 官网 下载源码,执行如下命令编译:
cd glfw
cmake -DCMAKE_OSX_ARCHITECTURES=arm64 ./
make -j4
sudo make install
2. 下载和配置 FFmpeg 源代码
下载 FFmpeg 源代码
使用 Git 下载 FFmpeg 源代码:
git clone http://source.ffmpeg.org/git/ffmpeg.git ffmpeg
cd ffmpeg
下载 ffmpeg-gl-transition
使用如下命令下载 ffmpeg-gl-transition 插件:
git clone https://github.com/transitive-bullshit/ffmpeg-gl-transition.git
3. 修改和调整代码
文档中提供的某些命令已经过时,因此需要手动调整。
修改 vf_gltransition.c
打开 ./ffmpeg-gl-transition/vf_gltransition.c
文件,找到这行代码:
.query_formats = query_formats,
将其替换为:
FILTER_QUERY_FUNC(query_formats),
注意不要漏掉任何标点符号。
修改 ffmpeg.diff
接着,打开 ./ffmpeg-gl-transition/ffmpeg.diff
文件,找到如下代码并删除:
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index 6eac828616..0570c1c2aa 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
@@ -357,6 +357,7 @@ extern AVFilter ff_vf_yadif;
extern AVFilter ff_vf_zmq;
extern AVFilter ff_vf_zoompan;
extern AVFilter ff_vf_zscale;
+extern AVFilter ff_vf_gltransition;
extern AVFilter ff_vsrc_allrgb;
extern AVFilter ff_vsrc_allyuv;
添加 gltransition
过滤器
打开 libavfilter/allfilters.c
,在 extern const AVFilter ff_vf_zscale;
后添加如下代码:
extern const AVFilter ff_vf_gltransition;
将 vf_gltransition.c
文件复制到 FFmpeg 中
执行如下命令将 vf_gltransition.c
复制到 FFmpeg 的 libavfilter
目录中,并应用补丁:
cp ./ffmpeg-gl-transition/vf_gltransition.c libavfilter/
git apply ./ffmpeg-gl-transition/ffmpeg.diff
4. 编译
配置并编译 FFmpeg,确保开启相关库和 gltransition
过滤器:
./configure --prefix=/opt/homebrew/Cellar --enable-gpl --enable-nonfree --enable-libass \
--enable-libfdk-aac --enable-libfreetype --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 \
--enable-libopus --enable-opengl --enable-filter=gltransition --extra-libs='-lGLEW -lglfw3'
make
5. 使用
编译完成后,运行如下命令检查 gltransition
是否成功编译:
./ffmpeg -v 0 -filters | grep gltransition
如果显示了 gltransition
过滤器,则表示成功。下面是使用该过滤器的两个示例:
示例 1:简单转场
./ffmpeg -i media/0.mp4 -i media/1.mp4 -filter_complex gltransition -y out.mp4
示例 2:使用自定义 GLSL 脚本
./ffmpeg -i media/0.mp4 -i media/1.mp4 -filter_complex "gltransition=duration=4:offset=1.5:source=crosswarp.glsl" -y out.mp4
参考资料
[1] GL Transitions: https://gl-transitions.com/