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 的。

 
 

你可能感兴趣的:(Media,Foundataion)