Loading

FFmpeg GL-transition转场的简单使用体验

写在前面

最近在处理视频,遇到两个视频之间的转场用原生的 xfade写起来很痛苦,实现成本高,难度大;我这里主要用的FFmpeg,就想找一个插件专门干转场这个事;搜索了一翻后找到 GL-transition这个转场神器;

GLTransitions 简介

GLTransitions(https://gl-transitions.com/) 是一款开源项目,主要提供了大量的视频转场动画效果。这些效果基于 GLSL ES 的 Fragment Shader 来实现,具有高度定制化和跨平台的特点。

下面是官网的例子:

https://www.bilibili.com/video/BV1Nh4y1h7EV/

https://www.bilibili.com/video/BV1jw411m7q7/

从上面例子来看,如果不用插件自己实现还是非常复杂的;FFmpeg整合后GLTransition的转场滤镜有76个,这是网友整理的效果:











































































这是76个滤镜的名称:

"Angular",
"BlurDirectional",
"BlurLinear",
"BlurZooming",
"Bounce",
"BowTieH",
"BowTieV",
"Burn",
"ButterflyWaveScrawler",
"Checker",
"Circle",
"CircleCrop",
"CircleOpen",
"ColorPhase",
"CrossHatch",
"CrossWarp",
"CrossZoom",
"Cube",
"Directional",
"DirectionalEasing",
"DirectionalPixelate",
"DirectionalRotate",
"DirectionalWarp",
"Dreamy",
"DreamyZoom",
"Fade",
"Fadecolor",
"FadeGrayScale",
"Flyeye",
"FractalNoise",
"GridFlip",
"Heart",
"Hexagonalize",
"InvertedPageCurl",
"Jaws",
"Kaleidoscope",
"LSD",
"LeftRight",
"LinearBlur",
"Luma",
"Mosaic",
"Morphology",
"Pinwheel",
"PolarFunction",
"PolkaDotsCurtain",
"RandomSquares",
"Ripple",
"Rotate",
"RotateScaleFade",
"SimpleZoom",
"SquaresWire",
"StereoViewer",
"Swap",
"Swirl",
"TangentialBlur",
"TileableRotate",
"UndulatingBurnOut",
"WaterDrop",
"Wind",
"WindowBlinds",
"WindowSlice",
"ZoomInCircles",
"barSwipe",
"colourDistance",
"crazyParametricFun",
"crosshatch",
"cubeSpinFade",
"displacementMap",
"doorway",
"fadeBlack",
"glitchMemories",
"invertedPageCurl",
"morph",
"perlin",
"radialBlur",
"squaresWire",
"swap",
"valentine",
"watercolour",
"windLeft"

自己实现

1、安装

正式编译安装

正式的安装无论是Linux还是Linux,还是都是需要重新编译FFmpeg,并把这个项目https://github.com/transitive-bullshit/ffmpeg-gl-transition 编译进去

./configure --prefix=/usr/local  
...
--enable-filter=gltransition --extra-libs='-lGLEW -lglfw'
...

看到这个--enable-filter=gltransition启用了就行

后面就可以直接使用:

ffmpeg -i media/0.mp4 -i media/1.mp4 -filter_complex gltransition -y out.mp4

测试体验安装

由于编译安装ffmpeg-gl-transition 有一定的门槛,这里可以体验nodejs实现的版本:ffmpeg-concat

1、先确定安装好ffmpeg;

2、安装好node.js

3、安装ffmpeg-concat: npm install -g ffmpeg-concat (可能需要魔法上网,装不上的话记得自己配置npm的代理)

我暂时也是用这种方式体验的;

(ps:这种方式临时文件大)

使用测试

我准备好了两个视频:input2.mp4 input3.mp4

ffmpeg-concat -d 1000 -t cube  -o cube1000.mp4 input2.mp4 input3.mp4

参数释义:

Usage: cli [options] <videos...>

Options:
-V, --version 输出版本
-o, --output 输出视频路径
-t, --transition-name gl-transition 转场名称
-d, --transition-duration 转场的时长毫秒(默认:500)
-T, --transitions 加载自定义转场的json文件路径
-f, --frame-format 临时帧图片的格式 (default: "raw")
-c, --concurrency 并发处理的视频数量 (default: 4)
-C, --no-cleanup-frames 不清空临时的帧图片
-v, --verbose ffmpeg调试模式verbose debug日志开启
-O, --temp-dir

临时帧图片的存储位置
-h, --help output usage information

由上可知,以上命令的含义是: 将input2/3.mp4 两个视频拼接起来,并且在中间使用"cube"这个转场衔接,转场持续1000ms;

自定义转场json文件方式

T.json

[{"name":"cube","duration":1000},{"name":"circleopen","duration":800}]

剩下的差不多

 npx ffmpeg-concat  -T T.json  -o output.mp4  input4.mp4 input2.mp4 input3.mp4 

总结

有此基本使用示例,那我们在通过变换参数的情况下,得到各种视频转场效果就显得轻而易举了;当然,看起来其实还可以通过加载json的方式实现自定义转场,时间有限,这个后面熟悉后再填坑。

今天先水这么多,收工!

引用

https://blog.csdn.net/w839687571/article/details/122013299

https://www.youtube.com/watch?v=PWp14WLzxDI

posted @ 2023-09-26 15:37  乔达摩(嘿~)  阅读(2828)  评论(0编辑  收藏  举报