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-transitio
n 有一定的门槛,这里可以体验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
-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的方式实现自定义转场,时间有限,这个后面熟悉后再填坑。
今天先水这么多,收工!