当前位置: 首页 > 编程语言 > C#

从视频中高效地抓取像素Share

时间:2023-04-11 00:59:07 C#

从视频中高效地抓取像素我正在寻找一种从视频文件中获取图像数据的有效方法。我目前正在测试Interop.QuartzTypeLib库中的FilgraphManagerClass.GetCurrentImage()。这就是我需要的,但速度很慢。我需要处理每个视频的所有帧。我有什么更好的选择?需求欢迎评论。一些代码请求:FilgraphManagerClassgraphClass=newFilgraphManagerClass();graphClass.RenderFile(@"C:tmptmp.avs");intsz=(graphClass.Width*graphClass.Height+10)*4;int[]buffer=newint[sz-1];然后我逐步浏览每一帧。我在一个循环中有这样的东西:graphClass.GetCurrentImage(refsz,outbuffer[0]);//DoStuff(缓冲区);graphClass.CurrentPosition+=graphClass.AvgTimePerFrame;您使用的IBasicVideo::GetCurrentImage方法基本上用于快照,并且仅用于传统模式下的传统视频渲染。也就是说,(a)它的时间不准确,这将允许您复制帧,或者相反,丢帧;(b)假设您正在显示视频。相反,您需要构建以下类型的过滤器图:文件源->...->样本采集器过滤器->空渲染器。SampleGrabber是一个标准组件,可以提供回调,通过回调调用任何帧数据。然后通过在过滤器图上调用SetReferenceClock(null)将时钟从图中删除,以便它尽可能快地运行(而不是实时运行)。然后运行图形,所有视频帧都将提供给您的回调。要在C#中完成任务,您需要使用DirectShow.NET库。它的CaptureDxSnap示例提供了一个简短的示例,说明如何使用SampleGrabber。他们通过BufferCB而不是SampleCB来做到这一点,而且效果也一样。其他样品也使用这种方法。您会发现与此任务非常接近的其他代码片段:关于MP4文件,您应该考虑以下几点:Windows中对MPEG-4的支持有限,您可能需要安装第三方组件来制作文件可播放。如果GraphEdit可以读取它们,那么您也可以。WindowsMediaPlayer可能正在使用,并且可能是更新的API,您应该更好地了解GraphEdit确保您在应用程序上使用Win32/x86平台,以避免遇到应用程序在64位域中运行的情况,但是不适用于MP4仅在已安装的32位组件/库中存在支持您还可以使用WindowsMediaFoundation创建分配器演示器。这将为您提供解码后的视频帧作为GPU纹理,您还可以使用CUDA或OpenCL执行您需要的处理(如果可能),这将极大地帮助您提高处理速度。以上就是C#学习教程:从视频中有效抓取所有像素共享的内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: