matlab - MATLAB中的视频播放器,按住滑块控件
问题描述
我创建了一个允许播放视频文件的 GUI。我使用 auicontrol
创建一个滑块,它适用于基本用例(当我在滑块上相对缓慢地单击时)。如果我在滑块的右箭头上按住鼠标左键一段时间,MATLAB 将在读取视频帧的行上返回错误(说它无法读取帧)。
我猜机器没有时间高速处理视频,有没有办法解决这个问题?
这是我的代码。
function test_video
figure;
hAxes = axes;
hSlider = uicontrol( 'Style', 'Slider' );
hSlider.Position(3) = 500;
hSlider.Callback = @Slider_Callback;
Reader = VideoReader( 'MyVideo.mp4' );
f = Reader.readFrame();
imshow( f, 'Parent', hAxes );
hSlider.Value = 1;
hSlider.Min = 1;
hSlider.Max = Reader.NumFrames-1;
iFrameRate = Reader.FrameRate;
function Slider_Callback( varargin )
iFrame = floor( varargin{ 1 }.Value );
dCurrentTime = iFrame / iFrameRate;
Reader.CurrentTime = dCurrentTime;
f = Reader.readFrame();
imshow( f, 'Parent', hAxes );
end % Slider_Callback
end
错误发生在回调函数中的一行:
f = Reader.readFrame();
它的内置函数(asyncio.Stream/wait)也有错误。
drawnow('limitrate');
解决方案
我无法测试解决方案,但您可以尝试添加一个标志,以防止回调已在运行时执行:
我对您的代码进行了一些其他更改(用于测试):
function test_video()
close all
figure;
hAxes = axes;
hSlider = uicontrol('Style', 'Slider');
hSlider.Position(3) = 500;
hSlider.Callback = @Slider_Callback;
Reader = VideoReader('MyVideo.avi');
f = Reader.readFrame();
imshow(f, 'Parent', hAxes);
NumFrames = Reader.Duration * Reader.FrameRate; %Reader.NumFrames;
hSlider.Value = 0;
hSlider.Min = 0;
hSlider.Max = NumFrames - 1; %Reader.NumFrames-1;
iFrameRate = Reader.FrameRate;
is_inside_callback = false;
function Slider_Callback(varargin)
if ~is_inside_callback
is_inside_callback = true;
iFrame = floor(varargin{1}.Value);
dCurrentTime = iFrame / iFrameRate;
Reader.CurrentTime = dCurrentTime;
f = Reader.readFrame();
imshow(f, 'Parent', hAxes);
is_inside_callback = false;
end
end % Slider_Callback
end
推荐阅读
- python - 'config(bg=[color])' 在课堂上不起作用吗?
- ruby - 我如何在动态定义的类的动态定义的子类中动态定义一个常量
- javascript - Javascript检查对象数组上是否存在任何值
- python - 无法将图像二进制文件添加到 multipart/form-data
- ios - TableView 未按应有的方式显示
- python - 在数据框中搜索模式
- angular - 设置角度垫选择的值
- python - 矩形感兴趣区域超出范围时出错 - opencv
- node.js - Node.js 返回值未定义
- reactjs - 在 React 中访问嵌套的 json