處理影片檔的工具很多; 但如果需要大量批次處理的話, 當然要學 ffmpeg , 因為你可以把它寫到 shell script 裡面去。 先前在玩 畫風轉移魔法 時, 繞了一些遠路, 不小心學了一些 ffmpeg 指令, 在這裡筆記一下。
首先安裝 mediainfo 套件, 以便從命令列查看影片檔的屬性。
例如可以這樣查影片寬度/高度/時間長度: mediainfo dog-water.mp4
| grep -Pi '^(width|height|duration)'
例如下面這個範例影片的大小是 426x240 長度 13 秒多。
截取畫面的右邊 2/3:
ffmpeg -i dog-water.mp4 -vf 'crop=284:240:142:0' out.mp4
或是
ffmpeg -i dog-water.mp4 -vf 'crop=iw*2/3:ih:iw/3:0' out.mp4
其中 "crop" 後面的四個數字依序為: 寬度、 高度、 捨棄左邊多少 pixels、
捨棄上面多少 pixels; iw 跟 ih 是內建的變數, 代表輸入影片的寬度與高度。
把畫面長寬各自變成兩倍:
ffmpeg -i dog-water.mp4 -vf 'scale=iw*2:ih*2' out.mp4
注意! 最終的長寬永遠都必須是 2 的倍數, 否則 ffmpeg 會罷工。
那如果長與寬的放大倍數不一致呢? 會以較大的數值為準。
總之 aspect ratio (長寬比) 永遠不會改變。
但若真的想把畫面變肥或變瘦該怎麼辦呢?
搜尋不到 :-( 除非你有
東海之花亞爾麗塔 的好運可以吃到滑滑果實,
不然就死了這條心吧~~
截取畫面左上 1/4, 再放大到跟原始影片一樣大小:
ffmpeg -i dog-water.mp4 -vf 'crop=213:120:0:0, scale=iw*2:ih*2' out.mp4
兩個重點: 轉換指令之間用逗點分隔;
iw 跟 ih 是以緊鄰上游轉換指令的結果為準,
而非以最初輸入的影片為準。
縮時攝影效果 -- 用一半的時間快動作把影片播完:
ffmpeg -i dog-water.mp4 -filter_complex
'[0:v]setpts=0.5*PTS; [0:a]atempo=2.0' out.mp4
這裡的 -filter_complex 表示採用功能較完整的轉換器 (過濾器);
[0:v] 表示第零個輸入檔的影像串流;
[0:a] 表示第零個輸入檔的聲音串流。
若要用先前採用的簡易轉換器語法, 則這樣下:
ffmpeg -i dog-water.mp4 -vf 'setpts=0.5*PTS'
-af 'atempo=2.0' out.mp4
反過來也可以 -- 拉長時間, 變成慢動作影片:
ffmpeg -i dog-water.mp4 -filter_complex '[0:v]setpts=2.0*PTS; [0:a]atempo=0.5' out.mp4
合併影片: ffmpeg -i f0.mp4 -i f1.mp4 -i f2.mp4 -i f3.mp4
-filter_complex '[0:v][1:v]hstack=inputs=2[top]; [2:v][3:v]hstack=inputs=2[bot]; [top][bot]vstack=inputs=2[out]'
-map '[out]' -c:v libx264 -crf 23 -preset veryfast out.mp4
這裡有四個輸入影片, 先把前兩個影片水平並列, 命名為 top,
再把後兩個影片水平並列, 命名為 bot,
最後把 top 跟 bot 上下疊起來, 命名為 out,
然後用 -map 選項指定輸出 out 。
官網 wiki 的 FilteringGuide 還有更多實用範例。
需要批次處理影片檔時, ffmpeg 真是太好用了啊!
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。