DirectShow学习
+ -

DirectShow实时源

2021-02-26 164 1

实时源(也称为推送push源)实时接收数据。示例包括视频捕获和网络广播。通常,活动源无法控制数据到达的速率。

如果满足以下任一条件,则筛选器被视为实时源:

  • 过滤器从IAMFilterMiscFlags::GetMiscFlags方法返回AM_FILTER_MISC_FLAGS_IS_SOURCE标志,并且至少有一个输出管脚公开IAMPushSource接口。
  • 过滤器公开IKsPropertySet接口并具有一个捕获pin(PIN_CATEGORY_CAPTURE)。有关详细信息,请参见接点特性集。

如果实时源筛选器提供时钟,则筛选器图形管理器在选择图形参考时钟时将首选该时钟。

延迟

过滤器的延迟是过滤器处理Sample所需的时间量。对于实时源,延迟由用于保存样本的缓冲区大小决定。例如,假设滤波器图具有延迟为33毫秒(ms)的视频源和延迟为500毫秒的音频源。在匹配音频Sample到达音频渲染器之前,每个视频帧到达视频呈现器约470毫秒。除非图形补偿了差异,否则音频和视频将不会同步。

可以通过IAMPushSource接口同步实时源。除非应用程序通过调用IAMGraphStreams::SyncUsingStreamOffset方法启用同步,否则筛选器图形管理器不会同步实时源。如果启用了同步,则过滤器图形管理器将查询每个源过滤器中的IAMPushSource。如果筛选器支持IAMPushSource,则筛选器图形管理器将调用IAMPlastency::GetLatency来检索筛选器的预期延迟。(IAMPushSource接口继承IAMPlastency。)根据组合的延迟值,筛选器图形管理器确定图形中的最大预期延迟。然后,它调用IAMPushSource::SetStreamOffset为每个源过滤器提供一个流偏移量,该过滤器将该偏移量添加到它生成的时间戳中。

此方法主要用于实时渲染。但是,请注意,实时捕获设备(如相机)上的预览pin不会在其提供的sample上设置时间戳。因此,要对实时捕获设备使用此方法,必须从捕获pin进行预览。

速率匹配

如果渲染器过滤器使用一个参考时钟调度采样,但源过滤器使用不同的时钟生成采样,则回放时可能会出现故障。渲染器可能比源运行得更快,从而导致数据中出现间隙。或者它可能比源运行得慢,导致Sample“聚集”,直到在某个点图形将丢弃样本。通常,实时源无法控制其生产速率,因此渲染器应该将速率与源匹配。

目前,只有音频渲染器执行速率匹配,因为音频播放中的故障比视频中的故障更明显。要执行速率匹配,音频渲染器必须选择与速率匹配的内容。它使用以下算法:

  • 如果图形未使用参考时钟,则音频渲染器不会尝试匹配速率。(每当图形没有参考时钟时,采样总是在到达时立即渲染。)
  • 否则,如果图形有一个参考时钟,音频渲染器将使用前面描述的条件检查上游是否有一个活动源。如果不匹配,则音频渲染器与速率不匹配。
  • 如果上游有一个活动源,并且该源在其输出pin上公开了IAMPushSource接口,则音频呈现器将调用IAMPushSource::GetPushSourceFlags。它查找以下标志之一:
    • AM_PUSHSOURCECAPS_INTERNAL_RM:此标志表示源过滤器有自己的速率匹配机制,因此音频渲染器不匹配速率。
    • AM_PUSHSOURCECAPS_NOT_LIVE:这个标志意味着源过滤器不是真正的活动源,即使它公开了IAMPushSource接口。因此,音频渲染器与速率不匹配。
    • AM_PUSHSOURCECAPS_PRIVATE_CLOCK:此标志表示源筛选器正在使用专用时钟生成时间戳。在这种情况下,音频渲染器根据时间戳匹配速率。(但是,如果采样没有时间戳,渲染器将忽略此标志。)
  • 如果GetPushSourceFlags不返回任何标志(零),则音频呈现器的行为取决于图形时钟以及示例是否具有时间戳:
    • 如果音频渲染器不是图形时钟,并且采样具有时间戳,则音频渲染器将速率与时间戳匹配。
    • 如果采样没有时间戳,音频渲染器将尝试匹配传入音频数据的速率。
    • 如果音频渲染器是图形时钟,它将尝试匹配传入的数据速率。

最后一种情况的原因如下:如果音频渲染器是参考时钟,并且源过滤器使用相同的时钟来生成时间戳,那么音频渲染器无法根据时间戳匹配速率。如果真的这样做了,实际上它将试图使利率与自身相匹配,这可能导致时钟漂移。因此,在这种情况下,渲染器匹配传入音频数据的速率。

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Directshow获取颜色空间分辨率
void GetColorSpaceResolution(){ HRESULT hr; AM_MEDIA_TYPE *pmt = NULL; VIDEOINFOHEADER *pvi = NULL; VIDEO_STREAM_CONFIG_CAPS scc; IAMSt......
DirectShow时钟时间
DirectShow定义了两个相关的时钟时间:参考时间和流时间。参考时间是参考时钟返回的绝对时间。(见参考时钟。)流时间是相对于图形上次开始运行的时间定义的。图形运行时,流时间等于参考时间减去开始时间。图形暂停时,流时间保持在暂停时的流时间。寻道操作后,流时间重置为零。图形停止时,流时间未定义。当媒......
DirectShow 事件产生
要处理DirectShow事件,应用程序需要一种方法来确定事件何时在队列中等待。过滤器图形管理器提供了两种方法:窗口通知:每当出现新事件时,过滤器图形管理器就会向应用程序窗口发送用户定义的窗口消息。事件信号:如果队列中有DirectShow事件,Filter Graph Manager将向Windo......
DirectShow 图形过滤(Filter)管理器介绍
Filter Graph Manager也是一个COM组件,它是DirectShow的控制中心,它控制Filter的运行。它有以下几个功能:协调各个Filter的状态。Filter有运行,暂停,停止三种状态,在Filter Graph中,各个Filter的状态必须协调一到,否则会引起冲突。Filte......
DirectShow播放UVC设备第二路码流方法
双码流播放Graphi图如上。双码流视频设备有两路捕获输出pin, RenderStream函数只会连接第一路pin,要播放第二路码流需要手动获取第二路pin,然后去连接解码器,再手动连接render,就可以显示了。示例代码// m_pGB 是 IGraphBuilder对象// m_pBF......
DirectShow 体系结构
DirectShow技术是建立在DirectDraw和DirectSound组件基础之上的,它通过DirectDraw对显卡进行控制以显示视频,通过DirectSound对声卡进行控制以播放声音。DirectShow的体系结构如下图所示:DirectShow 位于应用层中。它使用一种叫 Filter......
DirectShow实现视频的实时显示并抓图,可以设置视频参数
DirectShow抓图其实是使用IBasicVideo(IID_IBasicVideo)接口获取数据源,进行存储即可。IGraphBuilder* m_pGraphBuild = NULL;hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_......
DirectShow 过滤器之间数据交互
过滤器通过pin连接,连接的两个PIN在在上游过滤器叫做输出pin,下游过滤器的叫做输入pin。数据从上游过滤器传递给下游过滤器通过这两个上游过滤器的输出pin到下游过滤器的输出pin实现。通常,下游过滤器通过IMemInputPin::Receive来接收来自上游过滤器输出pin发送的数据。上下游......
DirectShow数据流
本节介绍DirectShow的数据的工作方式进行介绍。通过滤器之间数据交互一节可知,数据是存在buffer中的。而每个buffer都由一个名为media sample的COM对象包装,该对象实现了IMediaSample接口。Sample由另一种类型的对象(称为分配器)创建的,它由IMemAlloc......
DirectShow 简介
DirectShow是微软Windows操作系统平台关于多媒体架构的一套API接口。使用DirectShow,应用程序可以执行高质量的视频和音频播放或采集。DirectShow提供高质量的多媒体流捕获和播放。它支持多种格式,包括Advanced Systems Format(ASF)、Motion ......
DirectShow Samples和Allocators
在看本节前,我们首先明确2个概念。通过前面的章节可知:Samples是DirectShow各过滤器之间传输的数据的封包。Allocators是用于创建Samples的分配器。本节将详细介绍Allocators和Sample的原理。当一个过滤器通过其输出管脚将多媒体数据传输给另一个过滤器(通过其输入管......
DirectShow 接收事件
过滤器图形管理器公开了三个支持事件通知的接口。IMediaEventSink包含筛选器发布事件的方法。IMediaEvent包含应用程序检索事件的方法。IMediaEventEx继承并扩展IMediaEvent接口。过滤器通过调用Filter Graph Manager上的IMediaEventSi......
DirectShow数据传输协议
DirectShow数据传输协议定义为了进行数据交换,DirectShow的过滤器(filter)必须支持相关的数据传输协议,这个传输的协议叫做transports。当2个图形过滤器的pin相连接后,它们必须支持相同的transports,除非它们进行数据交换。通常,传输要求其中一个管脚支持特定接口......
DirectShow实时源
实时源(也称为推送push源)实时接收数据。示例包括视频捕获和网络广播。通常,活动源无法控制数据到达的速率。如果满足以下任一条件,则筛选器被视为实时源:过滤器从IAMFilterMiscFlags::GetMiscFlags方法返回AM_FILTER_MISC_FLAGS_IS_SOURCE标志,并......
DirectShow 过滤器的状态
过滤器有三种可能的状态:停止、暂停和运行。暂停状态的目的是提示图形中的数据,以便run命令立即响应。过滤器图形管理器控制所有状态转换。当应用程序调用IMediaControl::Run、IMediaControl::Pause或IMediaControl::Stop时,图形过滤管理器会在所有过滤器上......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!