關於MATLAB提取MP4視頻幀時候,跨幀取速度會慢
阿新 • • 發佈:2017-05-22
cnblogs name 需要 如果 這一 for off log ade
項目需要將視頻中每十幀抽取一幀,實際操作中發現,如果按照這樣來寫代碼
vid = VideoReader(namestr);
for ii = 1 : 10 : vid.NumberOfFrames frame = read(vid, ii); imwrite(frame, xxx, ‘jpg‘); end
設定循環變量為每10,然後直接從視頻對象中read出圖像幀,跑起來發現取一幀少則一秒 多則四五秒
這非常反直覺,因為大家逐幀抽取的時候都是一秒能抽好幾百幀。
仔細想一想其實MP4作為一種壓縮視頻的格式,在壓縮每一幀的過程中是使用到了前面幾幀的信息,所以我們在看一些有損壞的視頻的時候會出現連著幾秒都有色塊混亂,然後過了這一陣後面就好了。
於是在讀幀的時候直接從中間抽,它需要到前後去尋找有關聯的信息,這就耽誤了時間。
所以實際操作中不妨曲線救國,先把所有的幀都提出來,再按需抽取,就可以節約很多時間
vid = VideoReader(namestr);
for ii = 1 : vid.NumberOfFrames frame = read(vid, ii);% 讀取幀 imwrite(frame, xxx, ‘jpg‘); end imageName = 1; for ii = 1 : 10 : vid.NumberOfFrames movefile(xxx, yyy); imageName = imageName + 1 end
祝大家在視頻處理的過程中一切順利~
關於MATLAB提取MP4視頻幀時候,跨幀取速度會慢