您正在以尽可能快的速度显示图像,并且可以使用当前代码检索和显示它们。如果你想要一个特定的帧率,我会使用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 提高了解决方案的稳健性。
另一种方法是在 while 循环的底部放置一个 pause(1/framerate) 语句,但这不会考虑实际执行加载/显示所需的任何时间,因此帧速率不会保证非常一致。
其他想法
comments made below by @neuronet 让我思考为什么这可能不是VideoFileReader 或VideoPlayer 的功能。
VideoFileReader
正如@neuronet 所说,如果在使用VideoFileReader 读取的视频文件中指定了帧速率,那不能自动使用吗?
答案是,如果可以可以使用,但是有充分的理由不使用它。由于使用VideoFileReader.step() 获取新帧,因此必须在step() 上将其实现为某种速率限制器。
在这种特殊情况下,视频被用于显示目的;然而,情况并非总是如此。很多时候,您可能希望逐帧加载视频以进行一些分析(跟踪对象等)。现在想象一下,我的视频文件的帧速率设置为每秒 1 帧 (fps)。假设我想将此视频加载到 MATLAB 中,跟踪帧中的人,并向用户报告在视频播放过程中有多少人通过了视野。
如果 VideoFileReader.step() 被编写为仅以文件中指定的帧速率返回图像,这意味着我可以进行的处理速度最快的是每秒一帧。如果是这种情况,最终用户只会自己观看视频,我们就会失业!
另一个重要的考虑因素是,如果您真的想处理视频帧在将其显示给 VideoPlayer 对象,您需要以某种方式考虑该处理时间(即显然VideoFileReader 对此一无所知)。
VideoPlayer
另一种选择是为VideoPlayer 对象本身设置一个FrameRate 属性。
虽然这也可以完成,但目前的实现方式是不可能的。目前要显示新框架,您必须显式调用VideoPlayer.step() 方法。它遇到与VideoFileReader 相同的情况。它必须作为step() 方法的速率限制器来实现。
The Mathworks 完成这项工作的一种可能方法是使用step() 更新图像的替代方法。例如,NextImageFcn 回调什么的。然后VideoPlayer 可以在内部设置一个基于指定帧率的定时器,并在必要时执行回调(类似于我们的定时器回调)。
另一种选择是让VideoPlayer 接受VideoFileReader 对象作为输入。然后它可以使用这个对象来获取有关视频的信息(帧速率等)并以适当的速度显示图像。
不过,这里的主要问题是它只为一小部分用户服务。这是因为 MATLAB(和计算机视觉工具箱)的主要目标不是成为视频播放系统,而是旨在对视频进行 分析,而 VideoPlayer 对象旨在简化结果的显示。
也许这个功能会在未来实现,但现在这些是我对它为什么不存在的想法。