在matlab中更改MPEG文件帧内帧中的数据

时间:2014-11-17 08:19:22

标签: matlab mpeg

我需要在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);

1 个答案:

答案 0 :(得分:0)

我假设通过帧内帧你的意思是I帧。在解码之后,无法确定帧是I帧,P帧还是B帧。必须查看原始编码比特流来执行此操作。像ffprobe这样的工具可以帮助你解决这个问题。

如果您真的想要这样做,你可以这样做:

  1. 下载ffmpeg工具。它有一个名为ffprobe的函数或实用程序。在系统终端上,执行:

    ffprobe -show_frames -select_streams v:0 song.mpg

  2. 这将生成一个文本文件,其中包含有关每个帧的信息。您可以使用TEXTSCAN对此文件进行一些巧妙的文本处理,并查找PICT_TYPE = I并确定哪些帧是I帧。

  3. 使用这些索引使用VIDEOREADER读取帧。

  4. 使用VIDEOWRITER写出这些帧。

  5. 希望这有帮助。