我需要在matlab中读取MPEG视频,并更改Intra帧中的数据并将其再次保存为新的MPEG文件。有人可以建议我这样做吗?这是一项可能的任务还是不可能做到的?请帮帮我..提前致谢
我已经在matlab中读取了一个mpeg文件,并通过以下代码将其分成了几帧。你能告诉我如何识别帧内帧吗?我要更改该帧的像素值,我必须用这些帧制作一个新的mpeg文件。
%%Extracting & Saving of frames from a Video file through Matlab Code%%
clc;
close all;
clear all;
mov = VideoReader('song.mpg');
opFolder = fullfile(cd, 'pics');
%if not existing
if ~exist(opFolder, 'dir')
%make directory & execute as indicated in opfolder variable
mkdir(opFolder);
end
%getting no of frames
numFrames = mov.NumberOfFrames;
%setting current status of number of frames written to zero
numFramesWritten = 0;
%for loop to traverse & process from frame '1' to 'last' frames
for t = 1 : numFrames
currFrame = read(mov, t); %reading individual frames
opBaseFileName = sprintf('%3.3d.png', t);
opFullFileName = fullfile(opFolder, opBaseFileName);
imwrite(currFrame, opFullFileName, 'png'); %saving as 'png' file
%indicating the current progress of the file/frame written
progIndication = sprintf('Wrote frame %4d of %d.', t, numFrames);
disp(progIndication);
numFramesWritten = numFramesWritten + 1;
end %end of 'for' loop
progIndication = sprintf('Wrote %d frames to folder "%s"',numFramesWritten, opFolder);
disp(progIndication);
答案 0 :(得分:0)
我假设通过帧内帧你的意思是I帧。在解码之后,无法确定帧是I帧,P帧还是B帧。必须查看原始编码比特流来执行此操作。像ffprobe这样的工具可以帮助你解决这个问题。
如果您真的想要这样做,你可以这样做:
下载ffmpeg工具。它有一个名为ffprobe的函数或实用程序。在系统终端上,执行:
ffprobe -show_frames -select_streams v:0 song.mpg
这将生成一个文本文件,其中包含有关每个帧的信息。您可以使用TEXTSCAN对此文件进行一些巧妙的文本处理,并查找PICT_TYPE = I并确定哪些帧是I帧。
使用这些索引使用VIDEOREADER读取帧。
使用VIDEOWRITER写出这些帧。
希望这有帮助。