MATLAB中的Videoplayer,手持滑块控制
我已经创建了一个GUI,允许播放视频文件。我使用MATLAB中的Videoplayer,手持滑块控制,matlab,user-interface,video,Matlab,User Interface,Video,我已经创建了一个GUI,允许播放视频文件。我使用uicontrol创建滑块,它适用于基本用例(当我相对缓慢地单击滑块时)。 如果我在滑块的右箭头上按住鼠标左键一段时间,MATLAB将在读取视频帧的行上返回一个错误(表示无法读取帧) 我猜机器没有时间高速处理视频,有没有办法解决这个问题 这是我的密码 function test_video figure; hAxes = axes; hSlider = uicontrol( 'Style', 'Slider' );
uicontrol
创建滑块,它适用于基本用例(当我相对缓慢地单击滑块时)。
如果我在滑块的右箭头上按住鼠标左键一段时间,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)中也有一个错误
我无法测试该解决方案,但您可以尝试添加一个标志,以防止回调已在运行时执行: 我对您的代码做了一些其他更改(用于测试):
我无法重现这个问题。。。我在Windows10下使用Matlab2019a。(没有字段
Reader.NumFrames
)。您可以尝试添加hSlider.Enable='off'
在Slider_Callback
和hSlider.Enable='on'的开头代码>最后。我正在使用对象类VideoReader。查看文档,字段NumFrames
存在。通过添加代码,效果会更好,但滑块会闪烁。请尝试添加标志。
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