首页 > 解决方案 > 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');

标签: matlabuser-interfacevideo

解决方案


我无法测试解决方案,但您可以尝试添加一个标志,以防止回调已在运行时执行:

我对您的代码进行了一些其他更改(用于测试):

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

推荐阅读