综合 FFmpeg 编译使用 ffmpeg-gl-transition 以丰富视频特效

2024-11-19 05:45:47 +0800 CST views 2177

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/

推荐文章

JS 箭头函数
2024-11-17 19:09:58 +0800 CST
地图标注管理系统
2024-11-19 09:14:52 +0800 CST
html一个全屏背景视频
2024-11-18 00:48:20 +0800 CST
Gin 框架的中间件 代码压缩
2024-11-19 08:23:48 +0800 CST
初学者的 Rust Web 开发指南
2024-11-18 10:51:35 +0800 CST
jQuery `$.extend()` 用法总结
2024-11-19 02:12:45 +0800 CST
JavaScript设计模式:适配器模式
2024-11-18 17:51:43 +0800 CST
WebSocket在消息推送中的应用代码
2024-11-18 21:46:05 +0800 CST
120个实用CSS技巧汇总合集
2025-06-23 13:19:55 +0800 CST
前端代码规范 - 图片相关
2024-11-19 08:34:48 +0800 CST
Vue3中的v-for指令有什么新特性?
2024-11-18 12:34:09 +0800 CST
Rust 中的所有权机制
2024-11-18 20:54:50 +0800 CST
Manticore Search:高性能的搜索引擎
2024-11-19 03:43:32 +0800 CST
Vue3中如何处理SEO优化?
2024-11-17 08:01:47 +0800 CST
Go中使用依赖注入的实用技巧
2024-11-19 00:24:20 +0800 CST
Vue3中如何进行异步组件的加载?
2024-11-17 04:29:53 +0800 CST
程序员茄子在线接单