VideoReader |
读取视频文件 |
---|---|
readFrame |
从视频文件中读取视频帧 |
hasFrame |
确定帧是否可供读取 |
getFileFormats |
VideoReader 支持的文件格式 |
mmfileinfo |
有关多媒体文件的信息 |
VideoWriter |
写入视频文件 |
---|---|
open |
打开文件以写入视频数据 |
writeVideo |
将视频数据写入到文件 |
close |
写入视频数据之后关闭文件 |
getProfiles |
VideoWriter 支持的描述文件和文件格式 |
用 VideoWriter
对象根据数组或影片创建一个视频文件。该对象包含有关视频的信息以及控制输出视频的属性。您可以使用 VideoWriter
函数创建 VideoWriter
对象,指定其属性,然后使用对象函数写入视频。
v = VideoWriter(filename)
v = VideoWriter(filename,profile) %filename - 文件名,profile - 文件类型
v = VideoWriter(filename)
创建一个 VideoWriter
对象以将视频数据写入采用 Motion JPEG 压缩技术的 AVI 文件。v = VideoWriter(filename,profile)
还应用一组适合特定文件格式(例如 'MPEG-4'
或 'Uncompressed AVI'
)的属性。VideoWriter
支持以下文件扩展名。
.avi |
AVI 文件 |
---|---|
.mj2 |
Motion JPEG 2000 文件 |
.mp4 或 .m4v |
MPEG-4 文件 |
如果未指定有效的文件扩展名,VideoWriter
将追加扩展名 .avi
、.mj2
或 .mp4
,具体取决于profile
参数的值。如果未指定 profile
的值,则 VideoWriter
将创建一个 Motion JPEG 压缩的 AVI 文件并且扩展名为 .avi
。
文件类型,指定为下列值之一。
profile 的值 |
说明 |
---|---|
'Archival' |
采用无损压缩的 Motion JPEG 2000 文件 |
'Motion JPEG AVI' |
使用 Motion JPEG 编码的 AVI 文件 |
'Motion JPEG 2000' |
Motion JPEG 2000 文件 |
'MPEG-4' |
使用 H.264 编码的 MPEG-4 文件(Windows 7或更高版本或者 macOS 10.7 及更高版本的系统) |
'Uncompressed AVI' |
包含 RGB24 视频的未压缩 AVI 文件 |
'Indexed AVI' |
包含索引视频的未压缩 AVI 文件 |
'Grayscale AVI' |
包含灰度视频的未压缩 AVI 文件 |
profile
设置视频属性(例如 VideoCompressionMethod
)的默认值。
视频播放的速率
视频的播放速率(每秒帧数),指定为正数。
open |
打开文件以写入视频数据 |
---|---|
close |
写入视频数据之后关闭文件 |
writeVideo |
将视频数据写入到文件 |
VideoWriter.getProfiles |
VideoWriter 支持的描述文件和文件格式 |
按以下步骤将一组帧写入压缩的 AVI 文件:生成一组帧,为要写入的文件创建视频对象,然后将帧写入视频文件。
Z = peaks;
surf(Z);
axis tight manual
set(gca,'nextplot','replacechildren'); %设置坐标区和图窗属性,以生成视频帧。
v = VideoWriter('peaks.avi');%为输出视频文件创建 VideoWriter 对象并打开该对象以进行写入。
% 设置帧数
v.FrameRate = fps;
open(v);
for k = 1:200 %生成一组帧,从图窗中获取帧,然后将每一帧写入文件。
surf(sin(2*pi*k/200)*Z,Z)
frame = getframe(gcf);% 获取figure窗口
writeVideo(v,frame);%将每一帧写入文件。
end
close(v);
imwrite将图像写入图形文件
imwrite(A,filename)
imwrite(A,map,filename)
imwrite(A,filename)
将图像数据 A
写入 filename
指定的文件,并从扩展名推断出文件格式。imwrite
在当前文件夹中创建新文件。输出图像的位深度取决于 A
的数据类型和文件格式。对于大多数格式来说:
A
属于数据类型 uint8
,则 imwrite
输出 8 位值。A
属于数据类型 uint16
且输出文件格式支持 16 位数据(JPEG、PNG 和 TIFF),则 imwrite
将输出 16 位的值。如果输出文件格式不支持 16 位数据,则 imwrite
返回错误。A
是灰度图像或者属于数据类型 double
或 single
的 RGB 彩色图像,则 imwrite
假设动态范围是 [0,1],并在将其作为 8 位值写入文件之前自动按 255 缩放数据。A
中的数据是single
,则在将其写入 GIF 或 TIFF 文件之前将 A
转换为 double
。A
属于 logical
数据类型,则 imwrite
会假定数据为二值图像并将数据写入位深度为 1 的文件(如果格式允许)。BMP、PNG 或 TIFF 格式以输入数组形式接受二值图像。A
包含索引图像数据,则应另外指定 map
输入参数。imwrite(A,map,filename)
将 A
中的索引图像及其关联的颜色图写入由 map
filename
指定的文件。
A
是属于数据类型 double
或 single
的索引图片,则 imwrite
通过从每个元素中减去 1 来将索引转换为从 0 开始的索引,然后以 uint8
形式写入数据。如果 A
中的数据是 single
,则在将其写入 GIF 或 TIFF 文件之前将 A
转换为 double
。绘制一系列图、将它们捕获为图像,然后写入 GIF 动画文件。
绘制 y = x n y=x^n y=xn,其中 n = 3 n=3 n=3。
x = 0:0.01:1;
n = 3;
y = x.^n;
plot(x,y,'LineWidth',3)
title(['y = x^n, n = ' num2str(n) ])
捕获 n n n 值递增时的一系列绘图。
n = 1:0.5:5;
nImages = length(n);
fig = figure;
for idx = 1:nImages
y = x.^n(idx);
plot(x,y,'LineWidth',3)
title(['y = x^n, n = ' num2str( n(idx)) ])
drawnow
frame = getframe(fig);% 获取figure窗口
im{idx} = frame2im(frame);% 转为彩色图像
end
close;
将多个系列的图像显示在一个图窗中。
figure;
for idx = 1:nImages
subplot(3,3,idx)
imshow(im{idx});
end
将九个图像保存到一个 GIF 文件中。因为 GIF 文件不支持三维数据,所以应调用 rgb2ind
,使用颜色图 map
将图像中的 RGB 数据转换为索引图像 A
。要将多个图像添加到第一个图像中,请使用名称-值对组参数 'WriteMode','append'
调用 imwrite
。
filename = 'testAnimated.gif'; % Specify the output file name
for idx = 1:nImages
[A,map] = rgb2ind(im{idx},256);
if idx == 1
imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',1);
else
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',1);
end
end
imwrite
将 GIF 文件写入您的当前文件夹。名称-值对组 'LoopCount',Inf
使动画连续循环。'DelayTime',1
在每个动画图像显示之间指定了一秒的时滞。
注意:imwrite写GIF的时候,只支持uint8类型的单通道数据,若为彩色图则需要如下操作
% 将彩色图转为索引图
[I,map] = rgb2ind(RGB,128);
我们先生成一个测试数据(256张尺寸为256*256的渐变图)
data = zeros(256,256,256,'uint8'); % 注意:imwrite写GIF的时候,只支持uint8类型的数据
for k = 1:255
data(:,k+1,k+1) = k;
data(:,:,k+1) = data(:,:,k+1)+data(:,:,k);
end
写为动图
dt = 1/32;
imwrite(data(:,:,1),'test1.gif','LoopCount',Inf,'DelayTime',dt);
for k = 2:256
imwrite(data(:,:,k),'test1.gif','WriteMode','append','DelayTime',dt);
end
%%名称-值对组 'LoopCount',Inf 使动画连续循环。'DelayTime',1 在每个动画图像显示之间指定了一秒的时滞。'WriteMode':'append'追加模式
写为视频
fps = 32;
myVideo = VideoWriter('test1.avi');
myVideo.FrameRate = fps; %确定帧速率32
open(myVideo);%打开视频
for k = 1:256
writeVideo(myVideo,data(:,:,k)); %将视频数据写入到文件
end
close(myVideo);
写为动图
clear;close all;clc;
j=1;
Z = peaks;
surf(Z)
axis tight
Zl=zlim;
for k = 1:20
surf(cos(2*pi*k/20)*Z,Z)
zlim(Zl);
% save to gif
f = getframe % 获取figure窗口
data=frame2im(f); % 转为彩色图像
[I,map] = rgb2ind(data,256); % 将彩色图转为索引图
if k==1
imwrite(I,map,'example.gif','gif','loopcount',inf,'Delaytime',0.2)
else
imwrite(I,map,'example.gif','gif','writemode','append','Delaytime',0.2)
end
end
%%名称-值对组 'LoopCount',Inf 使动画连续循环。'DelayTime',1 在每个动画图像显示之间指定了一秒的时滞。'WriteMode':'append'追加模式
写为视频
clear;close all;clc;
fps = 10;
myVideo = VideoWriter('media.avi');
myVideo.FrameRate = fps;
open(myVideo);
for j=1:100
set(gcf,'color','none');%设置背景色为无色
axis([-1,1,-1,1])%设置坐标轴范围
set(gca,'nextplot','replacechildren','box','off','color','k','xgrid','on') %设置坐标轴
Z=fft(eye(j+1));
plot(Z),hold on
pause(0.4)
axis([-1,1,-1,1]),drawnow
frame = getframe(gca);
im = frame2im(frame);
writeVideo(myVideo,im);
end
close(myVideo);
close all