FFmpeg 影片旋轉與 Metadata 旋轉標記(Side Data)處理解析

在處理手機或相機拍攝的影片時,常會遇到「畫面明明是直的,但處理後方向卻亂掉」的狀況。這篇文章記錄了我理解 FFmpeg 畫面旋轉與消除 Metadata 轉向標記的經驗。


為什麼畫面會「轉兩次」?

影片的方向控制其實分為兩個層面:

  1. 原始像素資料:畫面實際儲存的長寬與像素陣列。

  2. Metadata 轉向標記(Displaymatrix Side Data):播放器讀取時,根據這項標記自動旋轉畫面(例如 -90.00 degrees)。

FFmpeg 預設在處理影片時,會自動套用 Metadata 的旋轉標記。如果你又手動加上 -vf transpose,就會導致畫面被「旋轉了兩次」。


實例觀察

以我自行拍攝的影片 20191216.mp4 為例:

1. 檢視原始影片資訊

透過 ffprobe 可以發現,該影片原始像素資料其實是橫式(3840x2160),但含有旋轉標記:

Stream #0:1: Video: hevc, yuvj420p, 3840x2160, DAR 16:9 ...

    Side data:

      displaymatrix: rotation of -90.00 degrees

若直接擷取單幀畫面,FFmpeg 會自動套用旋轉標記,因此輸出呈現直式:

ffmpeg -i '20191216.mp4' -vf "format=yuv420p" -vframes 1 20191216.jpg

2. 直接使用 -vf transpose 的問題

如果直接對影片加上 transpose 濾鏡,FFmpeg 會先套用 Metadata 旋轉,再執行 transpose,且原有的旋轉標記依然會保留在輸出檔中

  • 順時針轉 90 度 (transpose=1)

    ffmpeg -i '20191216.mp4' -vf "transpose=1,format=yuv420p" -vframes 1 20191216_tr1.jpg

  • 逆時針轉 90 度 (transpose=2)

    ffmpeg -i '20191216.mp4' -vf "transpose=2,format=yuv420p" -vframes 1 20191216_tr2.jpg


上圖可看出原圖(右)、transpose=2是逆時針90度(左)、transpose=1是順時針90度(右)。


關鍵解決方案:歸零旋轉標記 (-display_rotation 0)

若要完全掌控畫面轉向並清除 Metadata 標記,必須在輸入參數(-i 之前)加上 -display_rotation 0,強制 FFmpeg 忽略 Metadata 的轉向設定:

ffmpeg -display_rotation 0 -i '20191216.mp4' -vf "format=yuv420p" -vframes 1 20191216_dr0.jpg

此時再用ffprobe檢視 Side data,旋轉標記已被歸零:

Side data:

      displaymatrix: rotation of -00.00 degrees


上圖可看出失去旋轉標記的影片是逆時針轉90度的


完全掌握FFMPEG旋轉與翻轉指令

在忽略 Metadata(-display_rotation 0)的前提下,搭配 -vf transpose 參數便能精準控制最終輸出畫面:

1. 純旋轉

  • 順時針轉 90 度 (transpose=1)

    ffmpeg -display_rotation 0 -i '20191216.mp4' -vf "transpose=1,format=yuv420p" -vframes 1 20191216_dr0_tr1.jpg

  • 逆時針轉 90 度 (transpose=2)

    ffmpeg -display_rotation 0 -i '20191216.mp4' -vf "transpose=2,format=yuv420p" -vframes 1 20191216_dr0_tr2.jpg

2. 旋轉 + 水平翻轉

  • 逆時針轉 90 度 + 水平翻轉 (transpose=0)

    ffmpeg -display_rotation 0 -i '20191216.mp4' -vf "transpose=0,format=yuv420p" -vframes 1 20191216_dr0_tr0.jpg

  • 順時針轉 90 度 + 水平翻轉 (transpose=3)

    ffmpeg -display_rotation 0 -i '20191216.mp4' -vf "transpose=3,format=yuv420p" -vframes 1 20191216_dr0_tr3.jpg



上圖是有/無水平翻轉的比較圖


速查表:-vf transpose 參數對照

參數值效果描述
0逆時針轉 90 度 + 水平翻轉
1順時針轉 90 度
2逆時針轉 90 度
3順時針轉 90 度 + 水平翻轉

總結

處理手機影片旋轉問題時,記得核心原則:先用 -display_rotation 0 清除 Metadata 影響,再使用 -vf transpose 重構影像資料,即可完美解決影片畫面方向異常的問題。


留言