2018年10月9日 星期二

影片裁剪合併/放大縮小/快轉慢播的萬用工具 ffmpeg

處理影片檔的工具很多; 但如果需要大量批次處理的話, 當然要學 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 真是太好用了啊!

沒有留言:

張貼留言