Одновременное воспроизведение нескольких видео с MATLAB - PullRequest
4 голосов
/ 17 октября 2011

Я искал в Интернете и переполнения стека, но не смог найти решение или даже полезные советы по моей проблеме.

Мне нужно написать специализированное программное обеспечение аннотации видео в MATLAB, который должен быть способен воспроизводить несколько видео(как минимум 2) одновременно в графическом интерфейсе.Видео файлы в кодировке XVID.До сих пор я просто настраивал пример mathworks.com для воспроизведения видео (xylophon.avi, см. Описание movie ()).

Я знаком с функциями mmreader, VideoReader, movie и implay, но все же яУ меня две проблемы:

  1. Даже если я читаю только небольшое количество кадров (как в примере с xylophon.avi), моя программа скоро превысит доступную память.Кроме того, для считывания даже относительно небольшого количества кадров (скажем, 100) требуется довольно много времени.

  2. Функция movie () является синхронной, поэтому второе видео не запускается до тех пор, пока не завершится первое видео.,Как я могу вызвать две функции movie () одновременно?Или есть другой способ показать два (или более) видео одновременно?

Есть предложения?Спасибо!

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Прежде всего, MATLAB не является многопоточным.Делать две вещи параллельно будет сложно.Попробуйте выйти на Java.Matlab использует JIDE в качестве графического интерфейса, основанного на Swing.Используйте MATLAB Builder JA для компиляции кода MATLAB в Java или добавьте свои собственные «панели» в IDE, как показано в в этом вопросе .

1 голос
/ 27 ноября 2017

Вы можете отобразить видео в двух разных окнах и одновременно начать воспроизведение, предоставив видео ручку и вызвав его недокументированную функцию воспроизведения.Это избавит вас от любой борьбы с видео неравной длины.

handle1 = implay('file1.mp4');
handle2 = implay('file2.mp4');

handle1.Parent.Position = [100 100 640 480];
handle2.Parent.Position = [740 100 640 480];

play(handle1.DataSource.Controls)
play(handle2.DataSource.Controls)
0 голосов
/ 18 октября 2011

В принципе, вы можете отображать каждый видеокадр в виде изображения и поочередно обновлять каждое видео, но заставить его воспроизводить видео с точно правильной частотой кадров может быть сложно.

Попробуйте что-то вроде следующего. Это, вероятно, не будет работать как есть, но вы должны быть в состоянии обновить его.

v1 = VideoReader(firstVideo)
v2 = VideoReader(secondVideo)

i1 = 0;
i2 = 0;
while i1 < v1.NumberOfFrames && i2 < v2.NumberOfFrames
    if i1 < v1.NumberOfFrames
        i1 = i1+1;
        subplot(1,2,1)
        image(v1.read(i1))
    end

    if i2 < v2.NumberOfFrames
        i2 = i2+1;
        subplot(1,2,2)
        image(v2.read(i2))
    end

    drawnow
end
...