实时源
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
实时源(也称为 推送源)实时接收数据。 示例包括视频捕获和网络广播。 通常,实时源无法控制数据到达的速率。
如果以下任一内容为 true,则筛选器被视为实时源:
- 筛选器从 IAMFilterMiscFlags::GetMiscFlags 方法返回AM_FILTER_MISC_FLAGS_IS_SOURCE标志,并且其输出引脚中至少有一个输出引脚公开 IAMPushSource 接口。
- 筛选器公开 IKsPropertySet 接口,并具有捕获引脚(PIN_CATEGORY_CAPTURE)。 有关详细信息,请参阅 固定属性集。
如果实时源筛选器提供时钟,则筛选器图形管理器在选择图形引用时钟时首选该时钟。 有关详细信息,请参阅 参考时钟。
延迟
筛选器的延迟是筛选器处理示例所需的时间。 对于实时源,延迟取决于用于保存样本的缓冲区的大小。 例如,假设筛选器图有一个视频源,延迟为 33 毫秒(ms),而音频源的延迟为 500 毫秒。 在匹配的音频示例到达音频呈现器之前,每个视频帧到达视频呈现器大约 470 毫秒。 除非图形补偿差异,否则音频和视频不会同步。
可以通过 IAMPushSource 接口同步实时源。 筛选器图形管理器不会同步实时源,除非应用程序通过调用 IAMGraphStreams::SyncUsingStreamOffset 方法启用同步。 如果启用了同步,筛选器图形管理器将查询每个源筛选器,IAMPushSource。 如果筛选器支持 IAMPushSource,则 Filter Graph 管理器会调用 IAMLatency::GetLatency 来检索筛选器的预期延迟。 (IAMPushSource 接口继承 IAMLatency.)从组合的延迟值中,Filter Graph 管理器确定图形中预期的最大延迟。 然后,它会调用 IAMPushSource::SetStreamOffset 为每个源筛选器提供一个流偏移量,该偏移量将筛选器添加到生成的时间戳中。
此方法主要用于实时预览。 但是,请注意,实时捕获设备上的预览图钉(如相机)不会在提供的示例上设置时间戳。 因此,若要将此方法用于实时捕获设备,必须从捕获引脚预览。 有关详细信息,请参阅 DirectShow 视频捕获筛选器。
目前,VFW 捕获 筛选器和 音频捕获 筛选器支持 IAMPushSource 接口。
速率匹配
如果呈现器筛选器使用一个引用时钟计划样本,但源筛选器使用其他时钟生成样本,则播放时可能会出现故障。 呈现器运行速度可能快于源,从而导致数据差距。 或者,它可能运行速度比源慢,导致样本“堆起来”,直到某个时候图形将删除样本。 通常,实时源无法控制其生产速率,因此呈现器应与源匹配速率。
目前,只有音频呈现器执行速率匹配,因为音频播放中的故障比视频中的故障更明显。 若要执行速率匹配,音频呈现器必须选择要匹配速率的内容。 它使用以下算法:
- 如果图形未使用引用时钟,则音频呈现器不会尝试匹配速率。 (每当图形没有参考时钟时,样本都会在到达时立即呈现。
- 否则,如果图形有引用时钟,则音频呈现器会使用前面所述的条件检查是否有实时源上游。 否则,音频呈现器与速率不匹配。
- 如果有实时源上游,并且该源在其输出引脚上公开 IAMPushSource 接口,则音频呈现器将调用 IAMPushSource::GetPushSourceFlags。 它查找以下标志之一:
- AM_PUSHSOURCECAPS_INTERNAL_RM。 此标志表示源筛选器有自己的速率匹配机制,因此音频呈现器不匹配速率。
- AM_PUSHSOURCECAPS_NOT_LIVE。 此标志表示源筛选器不是真正的实时源,即使它公开了 IAMPushSource 接口也是如此。 因此,音频呈现器与速率不匹配。
- AM_PUSHSOURCECAPS_PRIVATE_CLOCK。 此标志表示源筛选器使用专用时钟来生成时间戳。 在这种情况下,音频呈现器将速率与时间戳匹配。 (但是,如果示例没有时间戳,则呈现器将忽略此标志。
- 如果 GetPushSourceFlags 不返回任何标志(零),则音频呈现器的行为取决于图形时钟以及样本是否有时间戳:
- 如果音频呈现器不是图形时钟,并且样本具有时间戳,则音频呈现器将速率与时间戳匹配。
- 如果样本没有时间戳,则音频呈现器会尝试匹配传入音频数据的速率。
- 如果音频呈现器是图形时钟,它将尝试匹配传入的数据速率。
最后一种情况的原因是:如果音频呈现器是引用时钟,并且源筛选器使用相同的时钟来生成时间戳,则音频呈现器无法匹配时间戳的速率。 如果确实如此,实际上它将尝试将速率与自身匹配,这可能导致时钟偏移。 因此,在这种情况下,呈现器与传入音频数据的速率匹配。
相关主题
-
DirectShow 中的 时间和时钟