【问题标题】:Split an uncompressed video into segments with ffmpeg on MatLab?在 MatLab 上使用 ffmpeg 将未压缩的视频分割成片段?
【发布时间】:2017-03-10 21:06:09
【问题描述】:

我有一个视频序列(格式 Y4M),我想将其拆分为具有相同 GoP 大小的多个片段。 GoP = 8; 如何在 MatLab 中使用 FFMPEG 做到这一点?

【问题讨论】:

  • 那么您希望每个片段的长度为 8 帧吗?抱歉,我不太熟悉你的术语。
  • 是的,完全是@Cecilia。
  • 您想使用 FFMPEG 有什么特别的原因吗? Matlab 还有其他加载和处理视频的方法。
  • 没有,我只是不知道或者不知道如何使用它们。 @塞西莉亚

标签: matlab video ffmpeg video-processing


【解决方案1】:

在 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 不支持 Y4M,这是加载视频的最常见方式。 FFmpeg Toolbox 也不支持它,它只提供几种媒体格式(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,但我对这些方法中的任何一种都没有个人经验。

【讨论】:

  • 我会试试看它是否能解决主要的prblm。谢谢@cecilia
  • 我可能还有一个问题,为什么是 4D 矩阵?
  • Matlab 是围绕矩阵构建的,因此矩阵似乎是一种自然的选择,因为视频的元素(像素)是同质的、密集的并且由数字表示。
  • 我回到你身边,我可以阅读 Y4M 文件并获得所有帧的结构。如果我想按照你上面所说的那样做,我怎么能用我所拥有的呢?
  • 我已经更新了我的答案以包含一个结构数组示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2022-08-07
  • 2014-05-28
  • 1970-01-01
  • 2021-01-16
  • 2014-07-02
  • 1970-01-01
相关资源
最近更新 更多