使用WPF捕获视频的第一帧

时间:2009-03-24 18:03:26

标签: c# asp.net wpf

我需要捕获在asp.net网站上传的视频的第一帧。我真的很想用WPF做这件事(如果可能的话),但如果有人知道更简单的方法,我也会对此持开放态度。

我在WPF中看过使用MediaPlayer和RenderTargetBitmap的示例,但每个示例都假设视频可以通过URI访问。在我的场景中,我只有文件字节,我不想直接将视频存储在FS上。

http://blogs.msdn.com/delay/archive/2008/09/03/video-frame-grabbing-made-easy-how-to-quickly-capture-multiple-video-frames-with-wpf.aspx

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

我不知道这是可取的,因为它很可能要求你运行某种类型的消息泵,这在ASP.NET站点中是个坏主意。

相反,我会使用DirectShow API来尝试和处理视频。您应该能够使用它将内容作为字节流式传输,并且您不需要消息循环来处理视频。

您可以使用位于此处的DirectShow .NET包装器通过.NET访问它:

http://directshownet.sourceforge.net/

您将需要查看MSDN上的Sample Grabber示例:

http://msdn.microsoft.com/en-us/library/ms787867(VS.85).aspx

请注意,您可能不一定需要第一帧,就像许多视频一样,它们可能是黑色的,并且不是缩略图的理想选择。相反,你可能想要做Vista所做的事情,并寻找第一个非黑框。

答案 1 :(得分:2)

我最终使用FFMpeg.exeDownloaded from here)来捕获上传到我网站的视频的第一帧。这可能不是最理想的解决方案,但我没有任何DirectShow体验,在我看来,这个解决方案比提到的其他建议简单得多。

我无法将文件保存到文件系统,因此我只是将上传的字节写入磁盘上的临时文件,使用FFMpeg执行工作,然后删除在此过程中生成的每个文件。 / p>

此处理是在与请求线程不同的线程上完成的。如果我发现这是一个问题,我有一个单独的Windows服务,我可以卸载工作没有问题。

获取单个帧的语法如下:

FFMpeg.exe -i "c:\MyPath\MyVideo" -vframes 1 "c:\MyOutputPath\MyImage%d.jpg"

%d非常重要。如果不包含此项,FFMpeg将抛出错误。在写出文件时,%d将替换序列号。

我希望这有帮助!

答案 2 :(得分:0)