MF(二) Media Session



        Media Session 是一个管理管道中数据流的对象。他是整个程序模型中的枢纽,Media Session 导出 IMFMediaSession 接口,所有播放中的控制,例如暂停、播放、停止等都是通过 Media Session 来完成的。
       Media Session 有两种创建方式:
       1. 如果播放的媒体内容不是受保护的,那么可以直接调用 MFCreateMediaSession, 这个函数会在应用程序进程内创建Media Session。
       2. 如果播放的媒体内容是受保护的,那么可以调用  MFCreatePMPMediaSession 函数,这个函数会在 PMP (protected media path) 进程中创建 Media Session 对象实例,应用程序在使用Media Session的时候,根本不知道 Media Session 在哪里。 函数返回 Media Session 代理对象的指针,应用程序可以通过这个指针来操作Media Session。 这种情况也可以支持不含有包含的媒体播放。
       通过Media Session 来控制媒体播放(数据流)需要下面几步:
        1. 创建拓扑。 拓扑是数据流在管道流动图。
        2. 调用 IMFMediaSession::SetTopology 把拓扑放到Media Session 队列中。
        3. 控制数据流,是通过函数 IMFMediaSession::Start, IMFMediaSession::Pause, or IMFMediaSession::Stop. 
        4. 在应用程序退出前,调用 IMFMediaSession::Close 来关闭 Media Session
        5. 调用 IMFMediaSource::Shutdown 来关闭所有的Media Session。 在调用这个函数之前,要确定任何打开的Media source 都被正确关闭了(调用 IMFMediaSource::Shutdown)。

        在MF 程序中,不应该直接操作Media Source 来start,pause,stop 数据流。一切都是 Media Session 统一调度的。
         Media Session 还会管理一个叫做 Presentation Clock 的东东。 这个东东是Media Session 全全管理的,应用程序可以通过调用函数IMFMediaSession::GetClock  来获得这个对象的指针,不过这个对象只有在 Media Session 成功的设置了拓扑之后,才可以得到这个对象。否则返回 MF_E_CLOCK_NO_TIME_SOURCE ,应用程序时不应该直接对 Presentation Clock 进行start,pause,stop 操作。
       当Media Session 改变数据流状态的时候,会有相应的Event 从Media Session 发出来。
       例如:应该程序调用 hr = pMediaSession->Pause();
       如果内部的Presentation Clock, Media Source 被正确的 Pause 了,那么应该程序会接受到 MESessionPaused 的event。 Media Session 不是在任何时刻都可以被Pause 的,在调用 Pause 之前,应该调用 IMFMediaSession::GetSessionCapabilities 来确定当前是否支持 Pause 操作。 如果支持,会返回 MFSESSIONCAP_PAUSE 。
       调用 IMFMediaSource::Shutdown 函数,是不产生任何event 的。

 
 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值