在Vision System工具箱中控制视频播放器的帧率?

时间:2016-03-11 18:32:10

标签: matlab video matlab-cvst

如何在Matlab中的Vision System工具箱中控制视频播放器的播放速率?具体来说,我想减慢视频速度。例如,以下是如何加载和显示电影from the documentation

的简单示例
videoFReader = vision.VideoFileReader('viplanedeparture.mp4');
videoPlayer = vision.VideoPlayer;
while ~isDone(videoFReader)
  videoFrame = step(videoFReader);
  step(videoPlayer, videoFrame);
end
release(videoPlayer);
release(videoFReader);

我搜索了用户指南,了解如何在这些示例中以简单的方式更改帧速率,但没有找到任何内容。

1 个答案:

答案 0 :(得分:4)

您可以使用当前代码检索和显示图像的速度。如果你想要一个特定的帧速率,我会使用timer根据你想要的帧速率调用你的更新方法。这是一个非常强大的简短示例。

videoFReader = vision.VideoFileReader('viplanedeparture.mp4');
videoPlayer = vision.VideoPlayer;

framerate = 10; % in frames/second

t = timer('ExecutionMode', 'fixedRate', ...
          'Period', 1 / framerate, ...
          'TimerFcn', @(tmr,evnt)timerfcn(tmr, videoFReader, videoPlayer), ...
          'ErrorFcn', @(tmr,evnt)cleanup(tmr, videoFReader, videoPlayer));

show(videoPlayer);
start(t)

function timerfcn(tmr, reader, player)
    % While we have more to read, read and display it.
    if ~isDone(reader) && isOpen(player)
        step(player, step(reader));
    else
        cleanup(tmr, reader, player)
    end
end

function cleanup(tmr, reader, player)
    % Callback to ensure proper cleanup of objects
    if isvalid(tmr) && strcmpi(tmr.Running, 'on')
        stop(tmr);
        delete(tmr)
    end

    release(player);
    release(reader);
end

感谢horchler's comments提高解决方案的稳健性。

另一种方法是在pause(1/framerate)循环的底部放置一个while语句,但这不会考虑实际加载/显示所需的任何时间,因此框架价格不会保证非常一致。

其他想法

comments made below by @neuronet让我想到为什么这可能不是VideoFileReaderVideoPlayer的功能。

VideoFileReader

正如@neuronet所述,如果在使用VideoFileReader读取的视频文件中指定了帧速率,则无法自动使用?

答案是,是的,如果可以使用但是有充分的理由使用它。由于使用VideoFileReader.step()获取新帧,因此必须在step()上将其作为某种速率限制器实现。

在这种特殊情况下,视频用于显示目的;然而,情况并非总是如此。很多时候,您可能希望逐帧加载视频以进行一些分析(跟踪对象等)。现在想象一下,我的视频文件的帧速率设置为每秒1帧(fps)。让我们说我想将这个视频加载到MATLAB中,跟踪框架中的人,并向用户报告在视频过程中有多少人通过视野。

如果VideoFileReader.step()被写入以便它仅以文件中指定的帧速率返回图像,这意味着最快我可以进行处理将是每秒一帧。如果是这种情况,最终用户只会自己观看视频,我们就会失业!

另一个重要的考虑因素是,如果你真的想处理视频帧之前将它显示到VideoPlayer对象,你需要以某种方式考虑到处理时间(显然VideoFileReader没有任何线索。

VideoPlayer

另一种选择是为FrameRate对象本身提供VideoPlayer属性。

虽然也可以完成,但目前实现它的方式是不可能的。目前要显示新帧,您必须显式调用VideoPlayer.step()方法。它遇到与VideoFileReader相同的情况。它必须作为step()方法的速率限制器实现。

Mathworks可以实现此功能的一种可能方式是使用step()替换图像。例如,NextImageFcn回调或其他内容。然后VideoPlayer可以在内部根据指定的帧速率设置定时器,并在必要时执行回调(类似于我们的定时器回调)。

另一种选择可能是让VideoPlayer接受VideoFileReader个对象作为输入。然后,它可以使用此对象获取有关视频的信息(帧速率等)并以适当的速度显示图像。

这里的主要问题是,这只服务于一小部分用户。这是因为MATLAB(和计算机视觉工具箱)的主要目标不是视频播放系统,而是打算对视频和{{1}进行分析。 } object旨在简化结果的显示。

也许这个功能将来会实现,但是现在我想到它为什么不存在。