2012-03-19 44 views
2

我正在编写一个注册为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”实现?

如果我使用错误的术语,请随时纠正我。

感谢:-)

回答

3

这是一个很好的问题。一方面这是可行的,但有一些具体涉及。

首先,您的过滤器注册在CLSID_VideoInputDeviceCategory类别预计将作为一个实时视频源。通过这样做,您可以通过应用程序(例如Skype提供的应用程序)来发现这些应用程序,这些应用程序将尝试配置视频分辨率,他们希望视频以实时速率播放,某些应用程序(如Skype)不期望压缩这样的H.264视频,或者只是拒绝这样的设备。你既不能附加音频从右到这个过滤器的应用程序甚至不看的音频有(不知道你有你的过滤器的音频,但你提到.MP4文件,音频可能会出现)。

您提出的问题:

1 - 你必须的应用需求,更好的画面通过检查方法的应用程序调用上的过滤器是什么接口。大多数方法都由BaseClasses实现,并将调用转换为内部方法,如GetMediaType。是的,您需要实施它,通过这样做,您可以 - 通过尝试您支持的特定媒体类型,使您的过滤器与下游过滤器引脚连接。

同样,那些不能我MP4块,即使这样的做法可以在其他的DirectShow图形工作。实现视频捕获设备,你应该提供准确的视频帧,最好是解压缩(以及那些可能被过于压缩,但你会立即有兼容性issies与应用)。

您可能会想到的一种解决方案是在内部嵌入一个全功能图形,然后管道将这些图块解析并解码并传递给您的自定义渲染器,并将帧重新展示给它们关闭您的虚拟设备。这可能是一个很好的设计,尽管假设对过滤器内部工作方式有一定的了解。

2 - 如/有望成为活源,这意味着你在实时传送视频和框架不一定是时间标记您的设备通常处理。所以,你可以把时间那里,是的,你肯定需要从原始媒体中提取时间戳(或将其交由内部图表进行如上述第1项提到的),但请做好准备,应用带时间戳特别是对于预览的目的,因为来源是“现场”。

3 - 再回到音频,您可以不执行相同的虚拟设备上的音频。那么你可以,而且这个过滤器甚至可以在定制的图形中工作,但是这不适用于应用程序。他们将寻找独立的音频设备,如果你实现了这样的设备,他们会分开实例化它。因此,您需要实现虚拟视频和虚拟音频源,并在幕后实施内部同步。这是时间戳很重要的地方,通过正确提供它们,您可以在实时会话中保持唇形同步,使其与原始流式传输媒体文件上的唇形同步。