VideoWriter
创建对象以写入视频文件
说明
使用 VideoWriter
对象根据数组或 MATLAB® 影片创建一个视频文件。该对象包含有关视频的信息以及控制输出视频的属性。您可以使用 VideoWriter
函数创建 VideoWriter
对象,指定其属性,然后使用对象函数写入视频。
创建对象
描述
输入参量
filename
— 文件名
字符向量 | 字符串标量
文件名,指定为字符向量或字符串标量。VideoWriter
创建该文件。
VideoWriter
支持以下文件扩展名。
| AVI 文件 |
| Motion JPEG 2000 文件 |
| MPEG-4 文件(采用 Windows® 7 或更高版本或 macOS 10.7 及更高版本的系统) |
如果未指定有效的文件扩展名,VideoWriter
将追加扩展名 .avi
、.mj2
或 .mp4
,具体取决于 profile
参量的值。如果未指定 profile
的值,则 VideoWriter
将创建一个 Motion JPEG 压缩的 AVI 文件并且扩展名为 .avi
。
示例: 'myFile.avi'
示例: '../dir/videos/myFile.mj2'
profile
— 文件类型
'Motion JPEG AVI'
(默认) | 'Archival'
| 'Motion JPEG 2000'
| ...
文件类型,指定为下列值之一。
profile 的值 | 描述 |
---|---|
| 采用无损压缩的 Motion JPEG 2000 文件 |
| 使用 Motion JPEG 编码的 AVI 文件 |
| Motion JPEG 2000 文件 |
| 使用 H.264 编码的 MPEG-4 文件(Windows 7 或更高版本或者 macOS 10.7 及更高版本的系统) |
| 包含 |
| 包含索引视频的未压缩 AVI 文件 |
| 包含灰度视频的未压缩 AVI 文件 |
profile
设置视频属性(例如 VideoCompressionMethod
)的默认值。
属性
VideoWriter
对象包含控制输出视频的属性。您可以使用 VideoWriter
函数与预定义的描述文件创建一个 VideoWriter
对象,并为其设置适合特定格式(例如 'Uncompressed AVI'
或 'MPEG-4'
)的属性。例如,您可以使用 Motion JPEG AVI
描述文件创建一个 VideoWriter
对象并为 Quality
属性赋值。
v = VideoWriter('newfile.avi','Motion JPEG AVI'); v.Quality = 95;
对 VideoWriter
对象调用 open
函数后,将无法更改属性的值。因此,请在打开视频文件进行写入之前修改属性值。
ColorChannels
— 颜色通道数
正整数
此 属性 为只读。
每个输出视频帧中的颜色通道数,指定为正整数:
未压缩的 AVI、Motion JPEG AVI 和 MPEG-4 文件具有三个颜色通道。
索引和灰度 AVI 文件具有一个颜色通道。
对于 Motion JPEG 2000 文件,通道数取决于
writeVideo
函数的输入数据:单色数据为一个通道,彩色数据为三个通道。
数据类型: double
Colormap
— 视频文件的颜色信息
P
×3 数值矩阵
视频文件的颜色信息,指定为具有三列和最大为 256 行的数值矩阵。矩阵中的每一行均使用 RGB 三元组定义一种颜色。RGB 三元组是包含三个元素的行向量,其元素分别指定颜色中红、绿、蓝分量的强度。强度必须处于范围 [0,1]
中。
您可以在调用 open
之前显式设置颜色图,或在写入第一帧时使用影片帧结构体的 colormap
字段对其进行设置。
Colormap
属性仅应用于用来写入索引 AVI 文件的对象。
示例: colormap(summer(256))
数据类型: double
| uint8
CompressionRatio
— 目标压缩比
10
(默认) | 大于 1 的整数
目标压缩比,指定为大于 1 的整数。压缩比是指输入图像中的字节数与压缩图像中的字节数之间的比率。视频数据将会尽可能进行压缩,最高可达到指定的目标。
CompressionRatio
只可用于用来写入 Motion JPEG 2000 文件的对象。调用 open
之后,无法更改 CompressionRatio
值。如果之前将 LosslessCompression
设置为 true
,则设置 CompressionRatio
将生成错误。
示例: 5
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Duration
— 输出文件的持续时间
标量值
此 属性 为只读。
输出文件的持续时间(以秒为单位),指定为标量值。
数据类型: double
FileFormat
— 要写入的文件的类型
'avi'
| 'mp4'
| 'mj2'
此 属性 为只读。
要写入的文件的类型,指定为 'avi'
、'mp4'
或 'mj2'
。
Filename
— 文件名
字符向量 | 字符串标量
此 属性 为只读。
文件的名称,指定为字符向量或字符串标量。
FrameCount
— 帧数
整数
此 属性 为只读。
写入视频文件的帧数,指定为整数。
数据类型: double
FrameRate
— 视频播放的速率
30
(默认) | 正数
视频的播放速率(每秒帧数),指定为正数。
调用 open
之后,无法更改 FrameRate
值。
示例: 10
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Height
— 每个视频帧的高度
标量
此 属性 为只读。
每个视频帧的高度(以像素为单位),指定为标量。writeVideo
方法基于第一帧的尺寸设置 Height
和 Width
的值。
MPEG-4 文件需要可被二整除的帧尺寸。如果 MPEG-4 文件的输入帧高度不是偶数,VideoWriter
将在帧的底部填充一行黑色像素。对于 Windows 系统上的 MPEG-4 文件,允许的值取决于 Windows 的版本。
数据类型: double
LosslessCompression
— 无损压缩
true
或 1
| false
或 0
无损压缩,指定为数值或逻辑值 1
(true
) 或 0
(false
)。LosslessCompression
属性只可用于用来写入 Motion JPEG 2000 文件的对象。
如果 LosslessCompression
为 true
,则:
writeVideo
函数在写入数据时将保证解压缩之后的数据与输入数据相同。VideoWriter
将忽略CompressionRatio
的任何指定值。
调用 open
之后,无法更改 LosslessCompression
值。
默认情况下,LosslessCompression
对于 'Motion JPEG 2000'
描述文件为 false
,对于 'Archival'
描述文件为 true
。
MJ2BitDepth
— Motion JPEG 2000 文件的位深
范围 [1,16]
内的整数
Motion JPEG 2000 文件的位深,指定为 [1,16]
范围内的整数。位深是输入图像数据中的最低有效位数。
MJ2BitDepth
只可用于用来写入 Motion JPEG 2000 文件的对象。如果在调用 open
方法之前未指定值,VideoWriter
将基于输入数据类型设置位深。例如,如果 writeVideo
的输入数据为 uint8
或 int8
值的数组,则 MJ2BitDepth
为 8
。
示例: 8
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Path
— 视频文件的完整路径
字符向量 | 字符串标量
此 属性 为只读。
视频文件的完整路径,指定为字符向量或字符串标量。
Quality
— 视频质量
75
(默认) | 范围 [0,100]
内的整数
视频质量,指定为 [0,100]
范围内的整数。数字越大,视频质量越高,文件越大。质量数越小,则视频质量越低且文件大小越小。
Quality
仅可用于与 MPEG-4
或 Motion JPEG AVI
描述文件相关联的对象。调用 open
之后,无法更改 Quality
值。
示例: 50
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
VideoBitsPerPixel
— 每像素位数
数值标量
此 属性 为只读。
每个输出视频帧中每像素的位数,指定为数值标量。
AVI 文件(包含真彩色视频)、Motion JPEG AVI 和 MPEG-4 文件均为每像素有 24 位(三个颜色波段,每个都为 8 位)。
索引和灰度 AVI 文件为每像素 8 位。
对于 Motion JPEG 2000 文件,每像素的位数取决于 MJ2BitDepth
的值和图像数据的波段数。例如,如果 writeVideo
的输入数据为 uint16
或 int16
值的三维数组,则 MJ2BitDepth
的默认值为 16
,VideoBitsPerPixel
为 48
(位深的三倍)。
数据类型: double
VideoCompressionMethod
— 视频压缩的类型
'None'
| 'H.264'
| 'Motion JPEG'
| 'Motion JPEG 2000'
此 属性 为只读。
视频压缩的类型,指定为 'None'
、'H.264'
、'Motion JPEG'
或 'Motion JPEG 2000'
。
VideoFormat
— 视频格式的 MATLAB 表示
字符向量 | 字符串标量
此 属性 为只读。
视频格式的 MATLAB 表示形式,指定为字符向量或字符串标量。
对于 Motion JPEG 2000 文件以外的文件类型,VideoWriter
将 VideoFormat
设置为此表的下列值之一。
视频格式 |
|
---|---|
未压缩的 AVI、Motion JPEG AVI 或 MPEG-4 文件 | 'RGB24' |
包含索引视频的 AVI 文件 | 'Indexed' |
包含灰度视频的 AVI 文件 | 'Grayscale' |
对于 Motion JPEG 2000 文件,VideoWriter
基于 MJ2BitDepth
的值和 writeVideo
方法的输入图像数据格式来设置 VideoFormat
。例如,如果您未指定 MJ2BitDepth
属性,则 VideoWriter
按如下所示设置格式。
图像数据格式 |
|
---|---|
单波段 uint8 | 'Mono8' |
单波段 int8 | 'Mono8 Signed' |
单波段 uint16 | 'Mono16' |
单波段 int16 | 'Mono16 Signed' |
三波段 uint8 | 'RGB24' |
三波段 int8 | 'RGB24 Signed' |
三波段 uint16 | 'RGB48' |
三波段 int16 | 'RGB48 Signed' |
Width
— 每个视频帧的宽度
数值标量
此 属性 为只读。
每个视频帧的宽度(以像素为单位),指定为数值标量。writeVideo
函数基于第一帧的尺寸设置 Height
和 Width
的值。
MPEG-4 文件需要可被二整除的帧尺寸。如果 MPEG-4 文件的输入帧宽度不为偶数,则 VideoWriter
将在帧的右侧填充一列黑色像素。对于 Windows 系统上的 MPEG-4 文件,允许的值取决于 Windows 的版本。
数据类型: double
对象函数
open | 打开文件以写入视频数据 |
close | 写入视频数据之后关闭文件 |
writeVideo | 将视频数据写入到文件 |
VideoWriter.getProfiles | VideoWriter 支持的描述文件和文件格式 |
示例
创建 VideoWriter
对象并编写视频
按以下步骤将视频写入文件:创建一个随机数据数组,为输出文件创建 VideoWriter
对象,然后将该数组写入视频。
创建一个 300×300 的数据矩阵。
A = rand(300);
创建一个 VideoWriter
对象以写入名为 newfile.avi
的 Motion JPEG AVI 文件,然后打开该对象以进行写入。
v = VideoWriter("newfile.avi");
open(v)
将数据矩阵 A
写入视频文件。
writeVideo(v,A)
关闭 VideoWriter
对象。
close(v)
为未压缩的 AVI 指定描述文件并写入视频
使用指定的描述文件创建一个视频对象,创建包含一个 RGB 图像的数组,然后将该数组写入视频文件。
为 RGB24 视频的新的未压缩 AVI 文件创建一个 VideoWriter
对象。
v = VideoWriter("newfile.avi","Uncompressed AVI");
打开要写入的文件。
open(v)
创建一个包含来自示例静态图像 peppers.png
的数据的数组。将 A
中的图像写入视频文件。
A = imread("peppers.png");
writeVideo(v,A)
关闭 VideoWriter
对象。
close(v)
从动画创建 AVI 文件
设置坐标区和图窗属性,以生成视频帧。
Z = peaks; surf(Z); axis tight manual
set(gca,"NextPlot","replacechildren")
为输出视频文件创建 VideoWriter
对象并打开该对象以进行写入。
v = VideoWriter("peaks.avi");
open(v)
生成一组帧,从图窗中获取每个帧,然后将每一帧写入文件。
for k = 1:20 surf(sin(2*pi*k/20)*Z,Z) frame = getframe(gcf); writeVideo(v,frame) end
关闭 VideoWriter
对象。
close(v)
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2010b 中推出R2021b: 支持基于线程的环境
您可以使用 MATLAB backgroundPool
在后台运行 VideoWriter
。
R2021b: JPEG 2000 图像中的像素差异
R2021b 中的 JPEG 2000 图像与以前版本的 MATLAB 中的 JPEG 2000 图像之间可能存在像素值差异。
另请参阅
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)