C#从视频文件的一部分中提取帧

时间:2015-02-12 23:50:41

标签: c# video ffmpeg video-processing

使用AForge ffmpeg包装器,您可以使用VideoFileReader类从视频中提取帧并将其另存为位图。

请参阅以下示例: Extracting frames of a .avi file

我的问题是你无法指定从何处开始阅读框架。它始终从视频文件的开头开始。

但是,如果我想要提取两个小时长的视频文件中的帧,该怎么办?使用该类,您必须解析整个第一个小时的juste以获得这些帧。

有没有人知道实现这一目标的方法?

1 个答案:

答案 0 :(得分:6)

如果你知道想要开始阅读的视频在哪里,只需跳过适当数量的帧;没有必要处理它们中的任何一个。

当然,这假定您知道要从中开始读取的确切帧编号,您可以通过将帧速率乘以您想要执行提取的时间来计算。在您的示例中,如果视频长达两个小时,并且您想要从中间提取帧...

VideoFileReader reader = new VideoFileReader();
reader.Open("file.avi");

// Jump to 1 hour into the video
int framesToSkip = reader.FrameRate * 3600;    // 1 hour = 3600 seconds
for (int i = 0; i < framesToSkip; i++)
    reader.ReadVideoFrame();

// Now the next time ReadVideoFrame() is called, we will get the frame at the 1 hour mark

这假定.FrameRate属性以每秒帧数的形式返回值。不幸的是documentation没有说,所以我不确定它如何处理具有非整数帧速率的视频文件(即29.97是常见的帧速率)。