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的方式實現自定義轉場,時間有限,這個後面熟悉後再填坑。

今天先水這麼多,收工!

引用

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章