Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

VideoReader

创建对象以读取视频文件

说明

使用 VideoReader 对象读取包含视频数据的文件。该对象包含有关视频文件的信息,并允许您从视频中读取数据。您可以使用 VideoReader 函数创建 VideoReader 对象,使用对象的属性查询视频信息,然后使用对象函数读取视频。

有关详细信息,请参阅支持的视频和音频文件格式

创建对象

说明

示例

v = VideoReader(filename) 创建对象 v,用于从名为 filename 的文件读取视频数据。

示例

v = VideoReader(filename,Name,Value) 使用名称-值对组设置属性 CurrentTimeTagUserData。例如,VideoReader('myfile.mp4','CurrentTime',1.2) 开始读取 1.2 秒的视频。您可以指定多个名称-值对组。用单引号将每个属性名称括起来,后跟对应的值。

输入参数

全部展开

文件名,指定为字符向量或字符串标量。

有关详细信息,请参阅支持的视频和音频文件格式

示例: 'myFile.mp4'

示例: '../dir/videos/myFile.avi'

数据类型: char | string

属性

全部展开

VideoReader 对象的属性中包含有关视频文件的信息。除 CurrentTimeTagUserData 之外,属性均为只读。您可以在创建对象后查看或修改属性的值。例如,此命令查找 VideoReader 对象 vDuration 属性的值。

D = v.Duration;

此属性为只读

视频数据的每像素的位数,指定为数值标量。

数据类型: double

要读取的视频帧的时间戳,指定为数值标量。时间戳以距视频文件开头的秒数形式指定。CurrentTime 的值介于零和视频持续时间之间。

在某些平台上,当创建 VideoReader 对象时,'CurrentTime' 属性可能包含一个接近但不等于零的值。'CurrentTime' 属性值的这种差异是各个平台处理和读取视频的方式不同而导致的。

示例: 5.6

数据类型: double

此属性为只读

文件的长度(以秒为单位),指定为数值标量。

数据类型: double

此属性为只读

每秒的视频帧数,指定为数值标量。对于可变帧速率视频,FrameRate 是平均帧速率。

注意:对于 OS X Yosemite(10.10 版)和更高版本来说,使用 VideoWriter 编写的 MPEG-4/H.264 文件能正常播放,但显示的帧速率不精确。

数据类型: double

此属性为只读

视频帧的高度(以像素为单位),指定为数值标量。

数据类型: double

此属性为只读

文件名,指定为字符向量或字符串标量。

数据类型: char | string

此属性为只读

视频流中的帧数,指定为数值标量。

注意

对于某些长度的视频,NumFrames 属性的值并不会立即可用。要获取 NumFrames 属性,请在命令行中键入 v.NumFrames

数据类型: double

此属性为只读

与 reader 对象相关联的视频文件的完整路径,指定为字符向量或字符串标量。

数据类型: char | string

常规文本,指定为字符向量或字符串标量。

示例: 'Experiment 109'

数据类型: char | string

用户定义的数据,指定为任意数据类型的值。

此属性为只读

视频格式的 MATLAB 表示形式,指定为字符向量或字符串标量。

除 Motion JPEG 2000 文件之外的文件类型具有下列 VideoFormat 值之一。

视频格式

VideoFormat 的值

包含 RGB24 视频的 AVI 或 MPEG-4 文件

'RGB24'

包含索引视频的 AVI 文件

'Indexed'

包含灰度视频的 AVI 文件

'Grayscale'

Motion JPEG 2000 文件具有下列 VideoFormat 值之一。

图像数据格式

VideoFormat 的值

单条带 uint8'Mono8'
单条带 int8'Mono8 Signed'
单条带 uint16'Mono16'
单条带 int16'Mono16 Signed'
三条带 uint8'RGB24'
三条带 int8'RGB24 Signed'
三条带 uint16'RGB48'
三条带 int16'RGB48 Signed'

数据类型: char | string

此属性为只读

视频帧的宽度(以像素为单位),指定为数值标量。

数据类型: double

对象函数

hasFrame确定是否有视频帧可供读取
read读取一个或多个视频帧
readFrame读取下一个视频帧
VideoReader.getFileFormatsVideoReader 支持的文件格式

示例

全部折叠

为示例影片文件 xylophone.mp4 创建一个VideoReader 对象。

v = VideoReader('xylophone.mp4');

读取视频中的所有帧,一次一帧。

while hasFrame(v)
    frame = readFrame(v);
end

显示 readFrame 返回的最后一帧的有关信息。

whos frame
  Name         Size                Bytes  Class    Attributes

  frame      240x320x3            230400  uint8              

创建一个视频读取器对象,并从特定时间开始读取视频帧。

创建一个对象来读取示例影片文件 xylophone.mp4

v = VideoReader('xylophone.mp4');

指定在距视频开头 2.5 秒的位置开始读取。

v.CurrentTime = 2.5;

创建一个坐标区对象以显示帧。然后,继续读取和显示视频帧,直到没有可供读取的帧为止。

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

创建一个视频读取器对象,并使用帧索引读取一个或多个视频帧。

为示例影片文件 xylophone.mp4 创建一个VideoReader 对象。

v = VideoReader('xylophone.mp4');

只读取第一个视频帧。

frame = read(v,1);

只读取最后一个视频帧。

frame = read(v,Inf);

读取第 5 帧到第 10 帧。

frames = read(v,[5 10]);

从第 50 帧开始读取到视频文件结束。

frames = read(v,[50 Inf]);

通过指定帧索引从视频中读取一帧,然后以一次一帧的方式读取视频的其余帧。

创建一个 VideoReader 对象,并显示 CurrentTime 属性的值。对于此视频,CurrentTime 属性的零值表示没有从视频中读取任何帧。

vidObj = VideoReader('xylophone.mp4');
vidObj.CurrentTime
ans = 0

通过指定帧索引从视频中读取第 20 帧。然后显示 CurrentTime 属性的值。read 方法会自动更新 CurrentTime 属性,以反映已读到第 20 帧。在此步骤,调用 readFrame 函数将返回第 21 帧。

frame20 = read(vidObj,20);
vidObj.CurrentTime
ans = 0.6667

使用 readFrame 方法读取视频的其余帧。readFrame 方法返回对应于 CurrentTime 属性中时间的帧。例如,以下代码读取并显示从第 21 帧开始的帧,并持续到没有更多帧可读取为止。

while(hasFrame(vidObj))
    frame = readFrame(vidObj);
    imshow(frame);
    title(sprintf('Current Time = %.3f sec', vidObj.CurrentTime));
    pause(2/vidObj.FrameRate);
end

Copyright 2019 The MathWorks, Inc.

局限性

  • 对于 Windows® 上的某些 AVI、MOV 或 MP4 文件,使用 readFrame 函数读取文件中的所有帧可能会导致帧数不同于 VideoReader 对象的 NumFrames 属性返回的值。

提示

  • macOS 平台不再支持某些早期视频文件格式。要使用 VideoReader 读取此类文件,请:

    • 使用 QuickTime 播放器打开视频文件。如果播放器检测到文件的格式较旧,则会自动将该文件转换为较新格式。

    • 保存新转换的视频文件。

    • 使用 VideoReader 读取此新转换的视频文件。

扩展功能

在 R2010b 中推出