在 MatLab 上使用 ffmpeg 将未压缩的视频分割成片段?

Split an uncompressed video into segments with ffmpeg on MatLab?

我有一个视频序列(格式 Y4M),我想将它分成几个具有相同 GoP 大小的片段。 政府 = 8; 我怎样才能在 MatLab 中使用 FFMPEG 做到这一点?

在 Matlab 中表示视频的一种标准方式是 4D 矩阵。尺寸为高 x 宽 x 颜色通道 x 帧。一旦有了矩阵,就可以很容易地通过指定您想要的帧范围来获取时间片。

例如,您可以在for循环中一次抓取8帧

%Loads video as 4D matrix
v = VideoReader('xylophone.mp4');
while hasFrame(v)
    video = cat(4, video, readFrame(v));
end

%iterate over the length of the movie with step size of 8
for i=1:8:size(video, 4)-8 
    video_slice = video(:,:,:,i:i+7); %get the next 8 frames

    % do something with the 8 frames here

    % each frame is a slice across the 4th dimension
    frame1 = video_slice(:,:,:,1);
end

%play movie
implay(video)

表示视频的另一种最常见的方式是在结构数组中。您可以索引具有一定范围值的结构数组以切片 8 帧。我示例中的实际帧值存储在结构元素 cdata 中。根据您的结构,元素可能有不同的名称;查找具有 3d 矩阵值的元素。

% Loads video as structure
load mri
video = immovie(D,map);
%iterate over the length of the movie with step size of 8
for i=1:8:size(video, 4)-8 
    video_slice = video(i:i+7); %get the next 8 frames

    % do something with the 8 frames here

    % to access the frame values use cdata
    frame1 = video_slice(1).cdata
end

%play movie
implay(video)

棘手的部分是您的视频格式。 Matlab 的 VideoReader which is the most common way to load video. It is also not supported by the FFmpeg Toolbox 不支持 Y4M,后者仅提供少数媒体格式(MP3、AAC、mpeg4、x264、动画 GIF)。

还有其他几个问题在寻找解决这个问题的方法,包括

  1. how to read y4m video(get the frames) file in matlab
  2. How to read yuv videos in matlab?

我也会检查 the Matlab File Exchange,但我没有使用这些方法的个人经验。