2024/04/20

FFmpeg 逆轉VR片成2D 兼去魚眼!

本文已發佈逾4 年,除非文中有標注更新,否則內含的資訊有可能不合時宜,敬請注意!

不說不知,早一兩年流行過的VR/3D視頻片的格式還真不少,比較「通用」的有所謂左右格式SBS (side-by-side)的VR格式。基本上就是有魚眼效果、左右兩個畫面以微小角度模擬肉眼角視,再通過 Oculus Rift 或 Google Daydream 等虛擬現實頭戴式顯示設備播放,用戶抬頭、左右活動去看不同角度的虛擬現實。

一條「1080p」的VR片很可能是由兩條套用了魚眼鏡扭曲了的正方形視頻影片合成,像SBS的話,就可能是2160 pixels × 1080 pixels (左右各1080寬,雙加,高1080)。

如果有一條這樣的VR視頻影片,如何逆轉換成普通播放器可以正常播放的「單邊」2D影片?

免費的FFmpeg可以幫到大家!

這篇,會收錄如果用FFmpeg去裁切corp掉影片的看視解析度,和去魚眼效果(至少是減低吧)。

首先是選擇要左還是右。

如果是選擇要左的方格,就是要x,y分別為0,0開始,向右伸延1080、向下伸延1080,其餘棄之。

ffmpeg -i input.mp4 -filter:v "crop=1080:1080:0:0" output.mp4

如果是選擇要左的方格,就是要x,y分別為1081,0開始,向右伸延1080、向下伸延1080,其餘棄之。

ffmpeg -i input.mp4 -filter:v "crop=1080:1080:1081:0" output.mp4

當得到一條只有「單邊」影片後,就要處理魚眼了。

去除魚眼效果(實質上只是減少魚眼效果)的濾鏡「-vf」是「lenscorrection」。

格式是:
ffmpeg -i input.mp4 -vf "lenscorrection=cx=0.47:cy=0.54:k1=-.33:k2=0.01" output.mp4

是靠調整「cx」、「cy」、「k1」、「k2」的數值去處理。

不同鏡頭拍出來的扭曲程度都各有不同,只能用試錯法 trial and error去看看效果了。可能先用舊文《以FFMPEG的指令碼作簡單剪片》的方式,先剪一分鐘、幾十秒的短片出來試試才套用到整條片上面。

下面收錄了幾款去除魚眼效果設定:

For GoPro 2

ffmpeg -i input.mp4 -vf "lenscorrection=cx=0.5:cy=0.5:k1=-0.227:k2=-0.022" output.mp4

For GoPro 3+, 16:9 with FOV Wide

ffmpeg -i input.mp4 -vf "lenscorrection=0.5:0.5:-0.335:0.097" output.mp4

For GoPro Hero 5 & 6:

ffmpeg -i input.mp4 -vf 'lenscorrection=k2=0.006:k1=-0.18'  output.mp4

不喜歡CLI或者慊試錯法太麻煩的話,錢是可以解決問題的。有個叫「VideoProc」的收費視頻處理軟件,同時有Windows和Mac版,可以用GUI輕鬆搞定本篇文章甚至先前幾篇FFmpeg文章的工作。減價時索價美金$30 (一年授權)或終生授權美金$43 (原價美金$79)!

幾十塊美金,幾舊水港紙,這筆花不花就請看倌自行決定了。

減/去魚眼 (stackoverflow.com)
Is there a way to remove GoPro fisheye using ffmpeg

用ffmpeg裁切影片 (linuxuprising.com)
FFmpeg: How To Crop Videos, With Examples