Чтение видеофайлов

Считайте все кадры видео, кадры, запускающиеся в требуемое время или кадры в интервале требуемого времени.

Чтение всех кадров в видеофайле

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

Создайте объект VideoReader, сопоставленный с файлом примера, xylophone.mp4.

vidObj = VideoReader('xylophone.mp4');

Определите высоту и ширину кадров.

vidHeight = vidObj.Height;
vidWidth = vidObj.Width;

Создайте массив структур фильма MATLAB®, s.

s = struct('cdata',zeros(vidHeight,vidWidth,3,'uint8'),...
    'colormap',[]);

Считайте один кадр во время с помощью readFrame, пока конец файла не будет достигнут. Добавьте данные от каждого кадра видео до массива структур.

k = 1;
while hasFrame(vidObj)
    s(k).cdata = readFrame(vidObj);
    k = k+1;
end

Получите информацию о массиве структур фильма, s.

whos s
  Name      Size                Bytes  Class     Attributes

  s         1x141            32503552  struct   

s 1 141 массив структур, содержа данные из 141 кадра в видеофайле.

Отобразите пятый кадр, сохраненный в s.

image(s(5).cdata)

Измените размер текущей фигуры и осей на основе ширины и высоты видео. Затем проигрывайте фильм однажды в частоте кадров видео с помощью функции movie.

set(gcf,'position',[150 150 vidObj.Width vidObj.Height]);
set(gca,'units','pixels');
set(gca,'position',[0 0 vidObj.Width vidObj.Height]);
movie(s,1,vidObj.FrameRate);

Закройте фигуру.

close

Чтение всех кадров, начинающихся в требуемое время

Считайте часть видеофайла, начинающего 0,5 секунды с начала файла.

Создайте объект VideoReader, сопоставленный с файлом примера, 'xylophone.mp4'.

vidObj = VideoReader('xylophone.mp4');

Укажите, что чтение должно начать 0,5 секунды с начала файла путем установки свойства CurrentTime.

vidObj.CurrentTime = 0.5;

Создайте оси, чтобы отобразить видео. Затем считайте кадры видео, пока конец файла не будет достигнут.

currAxes = axes;
while hasFrame(vidObj)
    vidFrame = readFrame(vidObj);
    image(vidFrame, 'Parent', currAxes);
    currAxes.Visible = 'off';
    pause(1/vidObj.FrameRate);
end

Просмотр кадров видео в заданном временном интервале

Считайте часть видеофайла от 0,6 до 0,9 секунд.

Создайте объект VideoReader, сопоставленный с файлом примера, 'xylophone.mp4'.

vidObj = VideoReader('xylophone.mp4');

Создайте массив структур фильма MATLAB®, s.

s = struct('cdata',zeros(vidObj.Height,vidObj.Width,3,'uint8'),...
    'colormap',[]);

Укажите, что чтение должно начать 0,6 секунды с начала файла путем установки свойства CurrentTime.

vidObj.CurrentTime = 0.6;

Считайте один кадр за один раз, пока CurrentTime не достигнет 0,9 секунд. Добавьте данные от каждого кадра видео до массива структур, s.

k = 1;
while vidObj.CurrentTime <= 0.9
    s(k).cdata = readFrame(vidObj);
    k = k+1;
end

Просмотрите количество кадров в s.

whos s
  Name      Size              Bytes  Class     Attributes

  s         1x10            2305432  struct              

s 1 10 структура, показывающая, что были считаны 10 кадров.

Просмотрите свойство CurrentTime объекта VideoReader.

vidObj.CurrentTime
ans =

    0.9333

Свойство CurrentTime теперь больше, чем 0.9.

Поиск и устранение проблем

Не мог считать последний кадр видеофайла:

  • Метод hasFrame может возвратить логический 1, (TRUE), когда значение свойства CurrentTime равно значению свойства Duration. Это происходит из-за ограничения в базовых используемых API.

  • Постарайтесь не искать на последний кадр в видеофайле путем установки свойства CurrentTime на значение близко к значению Duration. Для некоторых файлов эта операция возвращает ошибку при указании, что конец файла был достигнут, даже при том, что значение CurrentTime является меньше, чем значение Duration. Это обычно происходит, если длительность файла больше, чем длительность видеопотока, и нет никакого видео, доступного, чтобы читать около конца файла.

  • Не используйте свойство Duration ограничить чтение данных из видеофайла. Лучше считывать данные, пока файл не сообщает, что больше нет кадров, доступных в чтение. Таким образом, используйте метод hasFrame, чтобы проверять, существует ли кадр, доступный в чтение.

Производительность чтения видео на Windows® Systems:

  • Чтобы достигнуть лучшей видео производительности читателя на Windows для MP4 и файлов MOV, MATLAB использует аппаратное обеспечение машинной графики системы для декодирования. Однако в некоторых случаях использование видеокарты для декодирования может привести к более плохой производительности в зависимости от определенного аппаратного обеспечения машинной графики в системе. Если вы замечаете более медленную видео производительность читателя в своей системе, выключаете аппаратное ускорение путем ввода:

    matlab.video.read.UseHardwareAcceleration('off')

    Аппаратное ускорение может быть повторно включено путем ввода:

    matlab.video.read.UseHardwareAcceleration('on')

Смотрите также

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте