查找视频中的帧数

Finding number of frames in a video

我试图逐帧显示视频,我需要知道其总帧数。但它显示错误:"unable to determine the number of frames in this file"。

obj = VideoReader('a.avi');
nof=obj.NumberOfFrames;
for i=1:nof
    img = read(obj,i);
    imshow(img);

end

视频可能以可变帧速率编码,在这种情况下,MATLAB 在读取最后一帧之前无法检测帧数(如记录here

要找出答案,您应该按照建议阅读最后一帧 here

Obj = VideoReader('varFrameRateFile.avi');
lastFrame = read(Obj, inf);
numFrames = Obj.NumberOfFrames;
vidFrames = read(readerobj);
numFrames = get(readerobj, ‘numberOfFrames’);

Matlab 将在未来版本中弃用 read() 和 NumberOfFrames。下面是我用来处理 Matlab 版本更改的一些视频打开和查找帧数函数。我已经在几个 avi 文件上测试了类似版本,并安装了所需的编解码器。

function [totalFrames] = findNumFrames(videoSrcPath, SelectedReader)
    % open video source
    if ( SelectedReader == 1 )
            % VideoReader currently has a read to random frame but will be
            % deprecated soon                
            videoSrc = VideoReader(videoSrcPath); 
    elseif ( SelectedReader == 0 )
            %vision.VideoFileReader does not have a read to random frame
            videoSrc = vision.VideoFileReader(videoSrcPath,...
               'ImageColorSpace', 'Intensity'); 
    end

    % get number of frames
    if ( SelectedReader == 1 )
        % The below read() and NumberOfFrames will be deprecated in
        % future versions and we will have to use SelectReader == 0
        % or readFrame 
        try                    
            lastFrame = read(videoSrc, inf); % need to read last frame to get the number of frames
            totalFrames = videoSrc.NumberOfFrames;                    
        catch
            warning('Problem using read - possibly deprecated. Using readFrame instead.'); 
        end

    elseif ( SelectedReader == 0 )

        totalFrames = 0;
        while( ~isDone(videoSrc) )
            step(videoSrc);
            totalFrames = totalFrames + 1;
        end
        reset(videoSrc);

    end

end