【发布时间】:2012-03-19 21:19:22
【问题描述】:
我正在编写一个注册为 CLSID_VideoInputDeviceCategory 的 DirectShow 源过滤器,因此可以将其视为视频捕获设备(例如,来自 Skype,它被视为另一个 WebCam)。 我的源过滤器基于来自here 的 VCam 示例,并且,目前,过滤器产生与此示例相同的输出(带有一个视频输出引脚的随机彩色像素,还没有音频),全部在 FillBuffer() 中实现唯一的输出引脚的方法。
现在实际情况会有点棘手 - 过滤器使用硬件设备的文件句柄,使用 CreateFile() API 调用打开(打开设备不在我的控制范围内,由 3Party 库完成)。然后它应该从这个句柄中读取数据块(通常是 256-512 字节的块大小)。 该设备是一个 WinUSB 设备,3Party 框架只是“给”我一个打开的文件句柄来读取块。 过滤器读取的数据是一个 *.mp4 文件,该文件从设备流式传输到“句柄”。
这种情况相当于源过滤器从磁盘上的 *.mp4 文件(以“块”形式)读取并将其数据推送到 DirectShow 图形,但无法从头到尾完全读取文件,所以文件大小是未知的(对吗?)。
我对 DirectShow 还很陌生,感觉好像缺少一些基本概念。如果有人可以指导我解决以下问题的解决方案\资源\解释,我会很高兴:
1) 从网络上的各种来源和 Microsoft SDK (v7.1) 示例中,我了解到应用程序(例如 Skype)要构建正确且有效的 DirectShow 图(因此它将成功呈现视频和音频),源过滤器引脚(从 CSourceStream 继承)应该实现方法“GetMediaType”。根据这个实现的函数的返回值,应用程序将能够构建正确的图形来呈现数据,从而构建正确的过滤器顺序。如果这是正确的 - 我将如何在我的情况下实现它,以便构建图形以以块的形式呈现 *.mp4 输入(我们可以假设块大小恒定)?
2) 我注意到 FillBuffer() 方法应该为它获取(和填充)的 IMediaSample 对象调用 SetTime()。我正在从设备读取原始 *.mp4 数据。我是否必须解析数据并从流中提取帧和时间值?如果是的话 - 一个例子会很棒。
3) 我是否必须将从文件句柄(“块”)接收到的数据拆分为视频和音频,或者是否可以将数据推送到图表而无需在源过滤器中对其进行操作?如果需要拆分 - 怎么做(数据不连续,并且被分成块),这会影响“GetMediaType”的期望实现吗?
如果我使用了不正确的术语,请随时纠正我。
谢谢:-)
【问题讨论】:
标签: windows sdk directshow