我正在编写一个注册为CLSID_VideoInputDeviceCategory的DirectShow源过滤器,因此它可以被视为一个视频捕获设备(例如,它被视为一个视频捕获设备另一个WebCam)。 我的源代码过滤器基于来自here的VCam示例,现在,滤镜会生成如此示例的精确输出(带有一个视频输出引脚的随机彩色像素,无音频),所有这些都在FillBuffer()方法中实现的唯一输出引脚。DirectShow - 如何从源过滤器读取文件
现在真实场景会有点棘手 - 过滤器使用文件句柄到硬件设备,使用CreateFile()API调用打开(打开设备不在我的控制之下,并且由3Party图书馆)。它应该从这个句柄中读取数据块(通常是256-512字节的块大小)。 该设备是一个WinUSB设备,3Party框架只是“给我”一个打开的文件句柄来读取块。 过滤器读取的数据是* .mp4文件,从设备流式传输到“句柄”。
此方案等同于从磁盘上的* .mp4文件(以“块”形式)读取并将其数据推送到DirectShow图形的源过滤器,但无法从开始到结束完全读取文件,所以文件大小是未知的(正确?)。
我对DirectShow非常陌生,感觉好像缺少一些基本概念。我会很高兴,如果任何人都可以指导我解决以下问题的\ resources \解释:
1)从网络和Microsoft SDK(v7.1)示例的各种来源,我了解,对于应用程序如Skype)来构建正确的&有效的DirectShow图形(因此它将成功呈现视频&音频),源过滤器引脚(从CSourceStream继承)应实现方法“GetMediaType”。根据此实现函数的返回值,应用程序将能够构建正确的图来呈现数据,从而构建正确的过滤器顺序。如果这是正确的 - 我将如何在我的情况下实现它,以便图形将被构建为呈现* .mp4输入块(我们可以假设块大小不变)?
2)我注意到FillBuffer()方法应该为它获取(和填充)的IMediaSample对象调用SetTime()方法。我正在读取来自设备的原始* .mp4数据。我是否必须解析数据并从流中提取帧的时间值?&?如果是的话 - 一个例子会很棒。
3)我需要将从文件句柄(“块”)接收的数据拆分为视频&音频,还是可以将数据推送到图形,而无需在源过滤器中对其进行操作?如果需要分割 - 如何完成(数据不连续,并且分块为块),这是否会影响所需的“GetMediaType”实现?
如果我使用错误的术语,请随时纠正我。
感谢:-)