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_video.mp4 创建一个 VideoReader 对象。

v = VideoReader("xylophone_video.mp4");

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

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

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

whos frame
  Name         Size                Bytes  Class    Attributes

  frame      240x320x3            230400  uint8              

清除 VideoReader 对象。

clear v

为示例视频文件 xylophone_video.mp4 创建一个 VideoReader 对象。

v = VideoReader("xylophone_video.mp4");

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

v.CurrentTime = 2.5;

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

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

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

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

清除 VideoReader 对象。

clear v

为示例视频文件 xylophone_video.mp4 创建一个 VideoReader 对象。

v = VideoReader("xylophone_video.mp4");

只读取第一个视频帧。

firstFrame = read(v,1);

只读取最后一个视频帧。

lastFrame = read(v,Inf);

读取第 5 帧到第 10 帧。

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

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

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

显示视频帧变量的大小和类型信息。

whos *Frame*
  Name               Size                     Bytes  Class    Attributes

  earlyFrames      240x320x3x6              1382400  uint8              
  firstFrame       240x320x3                 230400  uint8              
  lastFrame        240x320x3                 230400  uint8              
  lateFrames       240x320x3x92            21196800  uint8              

清除 VideoReader 对象。

clear v

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

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

vidObj = VideoReader("xylophone_video.mp4");
vidObj.CurrentTime
ans = 0

通过指定帧索引从视频中读取第 20 帧。然后显示 CurrentTime 属性的值。read 方法会自动更新 CurrentTime 属性,以反映已读到第 20 帧。

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

在此点,调用 readFrame 函数将返回第 21 帧。

使用 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

Figure contains an axes object. The axes object with title Current Time = 4.700 sec contains an object of type image.

清除 VideoReader 对象。

clear vidObj

局限性

  • 对于某些 MP4 文件,NumFrames 属性可能在 Windows®Mac 和 Linux® 平台中返回不同值。这种差异是由底层平台特定 API 的差异造成的。

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

提示

  • 在 Windows 平台上,您无法修改或删除由工作区中的 VideoReader 对象引用的 AVI 文件。要从工作区中删除 VideoReader 对象,请使用 clear 函数。

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

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

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

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

扩展功能

版本历史记录

在 R2010b 中推出

全部展开