- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
状态转换 Filter Graph在任何时候只有三种状态:运行、暂停、停止。其中暂停可以理解为数据就绪状态,是为了快速切换到运行状态而设计的。作为一种中间状态,暂停也是停止与运行之间切换所必经的一种状态。 对Filter Graph状态的控制也就集中在三种状态之间的切换。在IGraphBuilder上申请IMediaControl接口。获得这个接口后,就可以使用其接口方法: IMediaControl::Run(); IMediaControl::Pause(); IMediaControl::Stop(); IMediaControl:: GetState( LONG msTimeout, OAFilterState *pfs); 速率调整 媒体文件播放时的当前位置和停止位置相对于开始位置都是不变的。调用IMediaSeeking接口的SetRate方法可以改变播放的速率。当应用程序执行了IMediaSeeking::SetRate后,Filter Graph Manager的内部响应如下: 1)调用IMediaSeeking::GetCurrentPosition得到当前播放位置 2)如果当前Filter Graph处于暂停或运行状态,则调用Stop 3)调用IMediaSeeking::SetPosition将步骤(1)中取得的当前位置重新设置一下 4)调用IMediaSeeking::SetRate设置新的播放速率 5)如果先前Filter Graph的状态为暂停或运行,则恢复这个暂停 利用IMediaSeeking接口的GetCurrentPosition和SetPosition可以实现媒体的随机定位。 事件通知 DirectShow有一种机制,能够让应用程序与Filter Graph Manager之间实现交互控制。这个机制就是事件通知(Event Notification),即当Filter状态转换、运行时遇到错误或要求重绘视频窗口时,都会发出一个特定的事件,由Filter Graph Manager处理或者转发给应用程序,应用程序可以接受事件,并根据事件类型作出相应的处理。 应用程序调用IMediaEvent::GetEvent方法来接收数据。这个方法会被阻断直到从一个队列中得到一个事件或者超过时限。因为事件通知和消息循环都是异步的,所以在应用程序对消息作出响应时,队列中有可能包含多个事件消息。因此,在事件处理代码中,应不停地的调用GetEvent方法,直至返回失败码,即消息队列已为空。 音视频同步 DirectShow的解决方案就是为Filter Graph选择一个公共的参考时钟,并且要求传送到Render Filter的每个Sample打上时间戳;Video Render和Audio Render根据Sample的时间戳以及参考时钟当前的参考时间,来正确安排Sample的播放时机。如果Sample到底的时间晚了,则马上播放这个Sample或丢弃该Sample,然后发生消息要求加快Sample的传送;如果Sample到达的时间早了,则Render Filter等待,直到Sample时间戳的开始时间再开始播放,并发生消息要求减慢Sample的发送。 硬件支持 为了提高系统的稳定性,Windows操作系统对硬件操作进行了隔离;应用程序一般不能直接访问硬件。DirectShow??Filter工作在用户模式(User mode,操作系统特权级别为Ring 3),而硬件工作在内核模式(Kernel mode,操作系统特权级别为Ring 0),那么它们之间怎么协同工作呢? DirectShow解决的方法是,为这些硬件设计包装Filter。这种Filter能够工作在用户模式下,外观、控制方法跟普通Filter一样,而包装Filter内部完成与硬件驱动程序的交互。这样的设计,使得编写DirectShow应用程序的开发人员,从为支持硬件而需做出的特殊处理中解脱出来。 #include dshow.h #include streams.h #pragma comment(lib, strmbasd.lib) // 包含库文件和头文件 ......... IGraphBuilder *pGraph = NULL; IMediaControl *pControl = NULL; IMediaEvent *pEvent = NULL; // 接口变量初始化 HRESULT hr = CoInitialize(NULL); // 初始化COM库 .......... hr = CoCreate
文档评论(0)