2016-07-24 134 views
0

我試圖提取一些視頻(其中每個包含大約13000幀)的所有幀與此代碼,但它需要太長時間來提取所有的幀。還有更快的方法嗎?用matlab提取視頻幀

filename = 'S.avi'; 
mov = VideoReader(filename); 

% Output folder 

outputFolder = fullfile(cd, 'S'); 
mkdir(outputFolder); 


%getting no of frames 
framee=100000; 
numberOfFrames = mov.NumberOfFrames; 
numberOfFramesWritten = 0; 
for frame =  1:12525 

    thisFrame = read(mov, frame); 
    framee=framee+1; 
    outputBaseFileName = sprintf('%3.3d.png', framee); 
    outputFullFileName = fullfile(outputFolder, outputBaseFileName); 
    imwrite(thisFrame, outputFullFileName, 'png'); 
%  progressIndication = sprintf('Wrote frame %4d of %d.', frame,numberOfFrames); 
%  disp(progressIndication); 
    numberOfFramesWritten = numberOfFramesWritten + 1; 

end 
progressIndication = sprintf('Wrote %d frames to folder "%s"',numberOfFramesWritten, outputFolder); 
disp(progressIndication); 
+0

使用可以使用的ffmpeg代替Matlab的... – Rotem

+0

我不知道是否有在MATLAB或沒有更優化的功能,但這個操作絕對可並行化,所以應該縮短處理時間。 –

回答

0

從概念上講,這與您所做的並不完全不同,但您的代碼中有許多迂迴步驟。

大概你可能只是這樣做:

mov = VideoReader(filename); 
vidFrames = read(mov); 

收集您的電影作爲一個四維陣列,然後就去做

for frame = 1 : size(vidFrames, 4) 
    outputBaseFileName = sprintf('%3.3d.png', frame); 
    outputFullFileName = fullfile(outputFolder, outputBaseFileName); 
    imwrite(vidFrames(:,:,:,frame), outputFullFileName, 'png'); 
end 

,它可能會更快。此外,你很可能parfor(或spmd具有計數功能手柄代替),以parallelise進一步