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