Видеоплеер в MATLAB, удерживая ползунок управления - PullRequest
1 голос
/ 18 марта 2020

Я создал GUI, позволяющий воспроизводить видеофайл. Я использую uicontrol для создания слайдера, он работает в базовых случаях c (когда я относительно медленно нажимаю на слайдер). Если я удерживаю левую кнопку мыши на правой стрелке ползунка в течение определенного времени, 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');

1 Ответ

1 голос
/ 19 марта 2020

Я не могу протестировать решение, но вы можете попробовать добавить флаг, который предотвращает выполнение обратного вызова, когда он уже запущен:

Я внес некоторые другие изменения в ваш код (для тестирования):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...