有沒有辦法從 FFMPEG 或類似程式中提取幀內並按原樣保存它們?我知道您可以使用 . 將幀提取為 JPEG 影像序列-f image2
。但這些是每一幀的完整影像。我只想匯出運動變化的圖像,因此我會讓 P 幀和 B 幀僅顯示運動變化,排除或掩蓋影像的未變化區域。
這可能嗎?
我正在使用的基本幀導出命令。這為我提供了指定 FPS 下每個畫面的全幀影像。
ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg
我希望導出幀,以便我有一個幀資料夾,其中第一幀是完整圖像,下一幀只是需要重新繪製圖像的圖像資料。暴露兩個幀之間的時間冗餘(這不是 I、P、B 幀所做的嗎?)
答案1
要提取某種類型的幀,請使用select
篩選:
select=eq(pict_type\,<x>)
其中是<x>
下列之一:pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI
例如:
ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4
要了解有關輸出的更多信息,請添加showinfo
篩選:
ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4
答案2
P 和 B 訊框通常不包含每個已變更區域的新影像資料。相反,圖片被分成不同類型的巨集塊。某些類型的宏塊包含新的圖像數據,但大多數宏塊基於其他參考圖片和運動向量來計算內容。
不完全是您所要求的,但這將使用顏色來向您顯示每個巨集區塊的類型:
ffmpeg -debug vis_mb_type -i input.mp4 output.mp4
或者
ffplay -debug vis_mb_type input.mp4
這也將顯示運動向量:
ffplay -debug vis_mb_type -vismv 7 input.mp4
有關每個 MB 顏色的更多信息,請參閱連結: