用ffmpeg解出影片yuv像素資料

先用ffprobe查看一下媒體資訊, 確定使用解出來的像素類型是yuv420或是yuv420p
ffprobe -i fhd_h264_video.mp4

Program 1 
    Stream #0:0[0x1023]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 59.94 tbr, 90k tbn, 59.94 tbc

上面就是我輸入的影片(fhd_h264_video.mp4)的執行結果,該影片用h.264的High profile設定,像素資料是yuv420p,解析度是1920x1080,30fps(29.97),另外SAR和DAR的解釋可以參考這篇

依照影片資訊我們想解出最適合YUV檔案
ffmpeg -i fhd_h264_video.mp4 -t 10 -pix_fmt yuv420p -y output.yuv

-t 10是指定只要取10秒的資料; 如果要指定起始時間, 需要用-ss {秒數}來指定
-pix_fmt yuv420p 就是解壓縮出來的yuv像素資料
-y 是如果輸出得檔案已經存在就覆蓋掉

Full HD解出來的yuv像素資料大小,應該是1920x1080解析度 x 每秒30張 x 10秒 x 每個yuv像素大小為1.5 bytes = 933120000 bytes

不過-t這參數的位置會影響運行結果,例如我寫在-i之前,最後會輸出304 frames,所以計算檔案大小的時候就需要,而寫在-i後面的話,最後會輸出300 frames。

更直接的方式就是用-frame指定處理張數100張
ffmpeg -i fhd_h264_video.mp4 -frames 100 -pix_fmt yuv420p -y output.yuv 

如果是要轉youtube上的4k超高畫質影片,媒體資訊印出來的可能會是yuv422p或者是yuv420p10le的像素資料,所以檔案大小的計算就會不同。以yuv420p10le, 3840x2160, 60 fps舉例: 3840x2160解析度 x 每秒60 張 x 10秒 x 每個yuv像素大小3 bytes = 14929920000 bytes

使用ffmpeg轉換的參考
http://rocksaying.tw/archives/22568176.html
http://lnpcd.blogspot.tw/2012/09/ffmpeg.html

留言