Sequencer 來源事件
當 Sequencer 來源 播放一連串檔案時,媒體會話通常會傳送在正常播放期間傳送的所有相同事件,並列在 媒體會話事件中。 應用程式會使用媒體會話的 IMFMediaEventGenerator 介面取得這些事件。
此外,還有一些特定于播放清單區段的事件。
事件 | 描述 |
---|---|
MENewPresentation | 向應用程式發出訊號,以預先註冊下一個拓撲。 為了在兩個連續的簡報之間提供順暢的轉換,排序器來源會事先載入下一個拓撲。 當作用中拓撲仍在播放時,只要來源中有後續可用的拓撲,排序器來源就會傳送此事件給下一個拓撲。 此事件的這個事件資料是下一個拓撲的呈現描述項。 應用程式負責在媒體會話上設定對應的拓撲,如 使用 Sequencer 來源中所述。 |
MEEndOfPresentationSegment | 當媒體會話完成播放目前區段時,如果該區段後面接著另一個區段,則排序器來源會引發此事件。 (如果目前的區段是最後一個區段,則排序器來源會改為引發 MEEndOfPresentation 事件。) 媒體會話會將此事件轉送至應用程式。 一般而言,應用程式會在媒體會話開始處理下一個區段之後接收 MEEndOfPresentationSegment ,但媒體接收仍會傳遞前一個區段的樣本。 |
MESessionTopologyStatus,狀態 MF_TOPOSTATUS_SINK_SWITCHED。 | 媒體會話會在轉換到排序器來源中的下一個拓撲時引發此事件,而媒體接收已完成播放先前的拓撲。 此事件包含下一個拓撲的指標。 |
範例 1:不略過播放
涉及排序器來源時,您從媒體會話取得的事件數目可能會令人混淆,特別是因為與某個區段相關聯的事件通常會與下一個區段的事件交錯。
在第一個範例中,應用程式會將三個區段排入佇列:S1、S2 和 S3。 第三個區段具有 SequencerTopologyFlags_Last 旗標,表示它是序列中的最後一個區段。 每個事件對應的區段會在括弧中指定。 也會列出應用程式的 SetTopology 呼叫,讓作業順序更清楚。
- 應用程式呼叫 IMFMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (S2 預先註冊)
- 應用程式呼叫 IMFMediaSession::SetTopology (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S1)
- MESessionTopologySet (S2)
- MEEndOfPresentationSegment (S1) 結尾
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED ( S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (轉換為 S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE S2) 開始 (
- MENewPresentation (S3 預先註冊)
- 應用程式呼叫 IMFMediaSession::SetTopology (S2)
- MESessionTopologySet (S3)
- MEEndOfPresentationSegment (S2) 結尾
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (轉換為 S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY ( S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S3)
- MEEndOfPresentation (S3 結尾;最後一個區段)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED
- MESessionEnded
此清單不包含您可能會收到的每個事件。 (例如,它會省略每當會話功能變更時傳送的 MESessionCapabilitiesChanged 事件。應用程式通常會在整個簡報中收到多個 MESessionCapabilitiesChanged 事件。) 這裡列出的事件是顯示從一個區段轉換到下一個區段的事件。 最重要的事件是 MENewPresentation,它會向應用程式發出預先註冊下一個拓撲的訊號,而 MEEndOfPresentationSegment則表示區段結尾 (,但最後一個區段除外) 。
因為 Media Foundation 中的事件是非同步,而且不會使用方法呼叫序列化,所以確切的順序可能會有所不同。 例如,您可以在應用程式呼叫SetTopology for S2 之前,收到 S1的MF_TOPOSTATUS_STARTED_SOURCE。
此外,您可能不會在這裡列出每個事件。 例如,除非最後一個區段具有SequencerTopologyFlags_Last旗標,否則不會傳送MEEndOfPresentation和MESessionEnded事件。
最後,此清單不會指出時間的經過時間。 從「S1 開始」到「S1 結束」的時間是 S1 的整個持續時間,視來源而定,這可能需要幾秒鐘或數小時的時間。
範例 2:使用區段略過播放
在此範例中,應用程式會將相同的區段排入佇列,但在播放區段 1 時跳到區段 3。 在此情況下,會傳送下列事件:
- 應用程式呼叫 IMFMediaSession::SetTopology (S1)
- MESessionTopologySet (S1)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S1)
- MENewPresentation (S2 預先註冊)
- 應用程式呼叫 IMFMediaSession::SetTopology (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S1)
- MESessionTopologySet (S2)
- 應用程式呼叫 IMFMediaSession::Start (跳至 S3)
- MENewPresentation (S3 預先註冊)
- 應用程式呼叫 IMFMediaSession::SetTopology (S3)
- MESessionStarted
- MEEndOfPresentationSegment (S1 已取消)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED ( S1)
- MESessionTopologySet (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (轉換為 S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_READY (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE ( S2)
- MEEndOfPresentationSegment (S2 已取消)
- MESessionTopologyStatus: MF_TOPOSTATUS_ENDED (S2)
- MESessionTopologyStatus: MF_TOPOSTATUS_SINK_SWITCHED (轉換為 S3)
- MESessionTopologyStatus: TOPOSTATUS_READY (S3)
- MESessionTopologyStatus: MF_TOPOSTATUS_STARTED_SOURCE (S3)
當應用程式呼叫 Start 以跳至區段 3 時,排序器來源會取消仍在播放的區段 1。 此區段的 MEEndOfPresentationSegment 事件包含 MF_EVENT_SOURCE_TOPOLOGY_CANCELED 屬性,表示該區段已結束,因為它已取消。 然後,因為區段 2 已經預先推出,所以該區段已啟動,但會立即取消。 區段 2 的 MEEndOfPresentationSegment 事件也包含 MF_EVENT_SOURCE_TOPOLOGY_CANCELED 屬性。 會話接著可以切換至區段 3,並正常播放。
相關主題