C#从WMV中提取特定帧

时间:2011-06-06 18:38:45

标签: c# video-processing

This example on Code Project几乎正是我需要的......除了saveFrameFromVideo需要百分比而不是帧数...

如何使用它从WMV文件中提取帧X?

我也尝试了FFmpeg.NET ...但是没有任何可下载的版本,我无法获得构建源代码......

3 个答案:

答案 0 :(得分:3)

您还可以尝试AsfMojo执行此任务,它允许您按时间偏移提取图像:

Bitmap bitmap = AsfImage.FromFile(videoFileName)
                        .AtOffset(17.34);

Media SDK和一些自定义流操作在内部用于获取帧精确静止帧(最大容差为100毫秒),因此如果您知道媒体文件的帧速率(即25),则可以计算时间偏移最近的框架:

int frameX = 400; //get 400th frame
double frameRate = 25.0;
double timeOffset = frameX / frameRate;

Bitmap bitmap = AsfImage.FromFile(videoFileName)
                        .AtOffset(timeOffset);

答案 1 :(得分:2)

魔术在这一行:

mediaDet.WriteBitmapBits(streamLength * percentagePosition, 
                    target.Width, target.Height, outputBitmapFile);

它是根据流的百分比和长度计算帧数。由于您已经知道了帧号,因此请使用它。

答案 2 :(得分:0)

我一直致力于从网络摄像头视频和视频文件中提取帧 - 对于两者,我使用了AForge库 - (您需要添加对AForge.Video,AForge.Imaging,AForge.Video.Directshow和AForge.Video的引用.FFMPEG)。对于实时视频,我添加了一个videoSourcePlayer_NewFrame(对象发送器,参考位图图像)来获取帧 - 位图图像包含Bitmap类型中所需的帧。这基本上是我在windows窗体中添加的videosource播放器的事件处理程序。 对于来自文件的视频,我用过: videoSource = new FileVideoSoource(fileName); videoSource.Start(); videoSource.NewFrame + = new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);

videoSource_NewFrame是事件处理程序,以防有新帧。