This example on Code Project几乎正是我需要的......除了saveFrameFromVideo
需要百分比而不是帧数...
如何使用它从WMV文件中提取帧X?
我也尝试了FFmpeg.NET ...但是没有任何可下载的版本,我无法获得构建源代码......
答案 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是事件处理程序,以防有新帧。