Этот пример показывает, как считать и хранить данные от всех кадров в видеофайле, отображает один кадр, и затем проигрывает все кадры в частоте кадров видео.
Создайте объект 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')
VideoReader
| mmfileinfo
| фильм