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

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

请参阅此示例: 提取.avi文件的帧

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

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

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

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

当然,这假定您知道要从中开始读取的确切帧编号,可以通过将帧速率乘以要执行提取的时间来计算。 在你的例子中,如果video是两个小时,你想从中间提取帧…

 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属性以每秒帧数的.FrameRate返回值。 不幸的是文档没有说,所以我不确定它如何处理具有非整数帧率的video文件(即29.97是常见的帧率)。