exponenta event banner

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

Считывание кадров из видео, начиная с определенного времени или индекса кадра, считывание кадров в пределах заданного интервала или считывание всех кадров в видео.

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

Считывайте часть видеофайла, начиная с начала файла на 0,5 секунды. Затем считывают видео, начиная с индекса 100 кадра и заканчивая видеофайлом.

Построить VideoReader объект, связанный с файлом образца 'xylophone.mp4'.

vidObj = VideoReader('xylophone.mp4');

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

vidObj.CurrentTime = 0.5;

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

while hasFrame(vidObj)
    vidFrame = readFrame(vidObj);
    imshow(vidFrame)
    pause(1/vidObj.FrameRate);
end

Figure contains an axes. The axes contains an object of type image.

Кроме того, можно считывать кадры из видео, начиная с указанного индекса кадра до конца видео, используя read способ. Укажите индексы для чтения как [100 Inf]. read возвращает все кадры, начиная со 100 до конца видеофайла.

vidframes = read(vidObj,[100 Inf]);

Считывание кадров в пределах указанного интервала

Прочитайте часть видеофайла, указав время или интервал кадров.

Считывайте видеокадры от 0,6 до 0,9 секунды. Сначала создайте объект видеопривода и массив структуры для хранения кадров.

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

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

vidObj.CurrentTime = 0.6;

Считывать по одному кадру за раз до CurrentTime достигает 0,9 секунды. Добавление данных из каждого видеокадра в массив структуры. Просмотр количества кадров в массиве структуры. s представляет собой структуру 1 на 10, указывающую, что считано 10 кадров. Для получения информации по отображению кадров в структуре s как фильм, см. movie страница ссылки на функцию.

k = 1;
while vidObj.CurrentTime <= 0.9
    s(k).cdata = readFrame(vidObj);
    k = k+1;
end
whos s
  Name      Size              Bytes  Class     Attributes

  s         1x10            2305344  struct              

Кроме того, можно считывать все кадры в указанном интервале с помощью индексов кадров. Например, укажите второй аргумент read как [18 27]. read метод возвращает FrameSize-by-10 массив указывает, что было прочитано 10 кадров.

frames = read(vidObj,[18 27]);
whos frames
  Name          Size                    Bytes  Class    Attributes

  frames      240x320x3x10            2304000  uint8              

Прочитать все кадры

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

Создайте объект video reader и отобразите общее количество кадров в видео.

vidObj = VideoReader('xylophone.mp4');
vidObj.NumFrames
ans = 141

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

while hasFrame(vidObj)
   frame = readFrame(vidObj);
   imshow(frame)
   pause(1/vidObj.FrameRate);
end

Figure contains an axes. The axes contains an object of type image.

В качестве альтернативы можно прочитать все видеокадры сразу. read метод возвращает FrameSize-по-141 массив видеокадров.

allFrames = read(vidObj);
whos allFrames
  Name             Size                      Bytes  Class    Attributes

  allFrames      240x320x3x141            32486400  uint8              

Устранение неполадок и советы по чтению видео

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

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

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

  • Производительность чтения видео в системах Windows ®: для достижения более высокой производительности чтения видео в Windows дляMP4 и MOV MATLAB ® использует графическое оборудование системы для декодирования файлов. Однако в некоторых случаях использование графической карты для декодирования может привести к снижению производительности в зависимости от конкретного графического оборудования в системе. Если вы заметили более низкую производительность устройства чтения видео, отключите аппаратное ускорение, введя :matlab.video.read.UseHardwareAcceleration('off'). Аппаратное ускорение можно повторно включить, введя: matlab.video.read.UseHardwareAcceleration('on').

См. также

| | | |

Связанные темы