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

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

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/

推荐文章

php客服服务管理系统
2024-11-19 06:48:35 +0800 CST
前端项目中图片的使用规范
2024-11-19 09:30:04 +0800 CST
Vue3中的v-slot指令有什么改变?
2024-11-18 07:32:50 +0800 CST
windon安装beego框架记录
2024-11-19 09:55:33 +0800 CST
Vue3中如何处理WebSocket通信?
2024-11-19 09:50:58 +0800 CST
Golang中国地址生成扩展包
2024-11-19 06:01:16 +0800 CST
如何在Rust中使用UUID?
2024-11-19 06:10:59 +0800 CST
初学者的 Rust Web 开发指南
2024-11-18 10:51:35 +0800 CST
Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
Golang Select 的使用及基本实现
2024-11-18 13:48:21 +0800 CST
在 Rust 生产项目中存储数据
2024-11-19 02:35:11 +0800 CST
前端如何一次性渲染十万条数据?
2024-11-19 05:08:27 +0800 CST
Vue 中如何处理跨组件通信?
2024-11-17 15:59:54 +0800 CST
File 和 Blob 的区别
2024-11-18 23:11:46 +0800 CST
Nginx 状态监控与日志分析
2024-11-19 09:36:18 +0800 CST
程序员茄子在线接单