2016-07-24 138 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进一步