Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中的Videoplayer,手持滑块控制_Matlab_User Interface_Video - Fatal编程技术网

MATLAB中的Videoplayer,手持滑块控制

MATLAB中的Videoplayer,手持滑块控制,matlab,user-interface,video,Matlab,User Interface,Video,我已经创建了一个GUI,允许播放视频文件。我使用uicontrol创建滑块,它适用于基本用例(当我相对缓慢地单击滑块时)。 如果我在滑块的右箭头上按住鼠标左键一段时间,MATLAB将在读取视频帧的行上返回一个错误(表示无法读取帧) 我猜机器没有时间高速处理视频,有没有办法解决这个问题 这是我的密码 function test_video figure; hAxes = axes; hSlider = uicontrol( 'Style', 'Slider' );

我已经创建了一个GUI,允许播放视频文件。我使用
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