C# 从视频文件的一部分中提取帧
C# extract frames from part of a video file
使用 AForge ffmpeg 包装器,您可以使用 VideoFileReader class 从视频中提取帧并将其保存为位图。
看这个例子:
Extracting frames of a .avi file
我的问题是您无法指定从何处开始读取帧。它总是从视频文件的开头开始。
但是如果我想提取两个小时长的视频文件中间的帧怎么办。使用那个 class 你必须解析整个第一个小时才能到达这些帧。
有人知道实现它的方法吗?
如果您知道要从视频的何处开始阅读,只需跳过适当数量的帧即可;无需处理任何一个。
当然,这假定您知道要开始读取的确切帧数,您可以通过将帧速率乘以要执行提取的时间来计算。在您的示例中,如果视频长达两个小时并且您想从中间提取帧...
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
属性 returns 以每秒帧数为单位的值。不幸的是 documentation 没有说明,所以我不确定它如何处理具有非整数帧率的视频文件(即 29.97 是常见的帧率。)
使用 AForge ffmpeg 包装器,您可以使用 VideoFileReader class 从视频中提取帧并将其保存为位图。
看这个例子: Extracting frames of a .avi file
我的问题是您无法指定从何处开始读取帧。它总是从视频文件的开头开始。
但是如果我想提取两个小时长的视频文件中间的帧怎么办。使用那个 class 你必须解析整个第一个小时才能到达这些帧。
有人知道实现它的方法吗?
如果您知道要从视频的何处开始阅读,只需跳过适当数量的帧即可;无需处理任何一个。
当然,这假定您知道要开始读取的确切帧数,您可以通过将帧速率乘以要执行提取的时间来计算。在您的示例中,如果视频长达两个小时并且您想从中间提取帧...
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
属性 returns 以每秒帧数为单位的值。不幸的是 documentation 没有说明,所以我不确定它如何处理具有非整数帧率的视频文件(即 29.97 是常见的帧率。)