寫在前面
最近在處理視頻,遇到兩個視頻之間的轉場用原生的 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的方式實現自定義轉場,時間有限,這個後面熟悉後再填坑。
今天先水這麼多,收工!