時序呈現時間
本主題描述 Sequencer 來源 如何處理播放期間的簡報時間。
概觀
排序器來源支援兩種不同的模式:播放清單序列和編輯序列。
在編輯順序中,應用程式會事先指定每個區段的持續時間,再開始播放。 在播放清單序列中,應用程式不會事先指定持續時間。 (事實上,持續時間可能未知。)
在這兩種情況下,您可以指定區段的媒體開始和媒體停止時間。 這些時間會指定來源檔案中區段開始和結束的位置。 例如,假設原始程式檔的長度為 90 秒。 如果您想要修剪前 10 秒和過去 10 秒,您會指定下列值:
- 媒體啟動:10 秒
- 媒體停止:80 秒
若要指定媒體開始時間,請在來源節點上設定 MF_TOPONODE_MEDIASTART 屬性。 若要指定媒體停止時間,請在來源節點上設定 MF_TOPONODE_MEDIASTOP 屬性。
若要建立編輯順序,請在建立媒體會話時設定 MF_SESSION_GLOBAL_TIME 屬性。 否則,媒體會話需要播放清單序列。 在編輯順序中,每個區段拓撲都必須具有 MF_TOPOLOGY_PROJECTSTART 屬性和 MF_TOPOLOGY_PROJECTSTOP 屬性。
播放清單序列
在播放清單序列中,簡報時鐘會從零開始,並繼續跨區段界限。 原生來源會提供時間戳記等於媒體時間的範例。 管線會將時間戳記轉換成正確的簡報時間,如下所示:
- 新時間戳記 = 媒體時間 + 位移 - 媒體啟動
位移的值是上一個區段結束的呈現時間。 第一個區段的位移為零。 以下是計算這些時間戳記轉換方式的兩個範例:
- 範例 1:假設第一個區段 (S1) 為 10 秒,而第二個區段 (S2) 有媒體開始時間為零。 原生來源會使用其時間戳記的媒體時間,因此 S2 的第一個範例具有零的時間戳記。 位移 (S1) 的持續時間為 10 秒,因此調整後的時間戳記為:0 + 10 - 0 = 10 秒。
- 範例 2:假設區段 S1 長度為 10 秒,而 S2 的媒體開始時間為 5 秒。 S2 的第一個範例具有 5 秒的時間戳記, (媒體時間) 。 位移為 10 秒,因此調整後的時間戳記為:5 + 10 - 5 = 10 秒。
來源節點下游的所有管線元件都會接收具有已調整時間戳記的範例。 拓撲中的來源節點可以有不同的媒體開始時間,因此會針對拓撲的每個分支個別計算調整。
當簡報切換至下一個區段時,簡報時鐘不會停止或重設,而且簡報時間會以單調方式增加。 在新的區段開始之前,媒體會話會傳送 應用程式 MESessionNotifyPresentationTime 事件。 事件會指定區段的開始時間,相對於表示時鐘,以及位移的值。 當新的區段啟動時,管線會呼叫排序器來源上的 Start ,其值為 VT_EMPTY。 排序器來源會傳送沒有開始時間的 MESourceStarted 事件。
若要搜尋,應用程式會指定區段識別碼加上區段內的時間位移。 搜尋之後,簡報時鐘會從 區段 位移開始。 以下是該程式運作方式的範例:
- 範例 3:應用程式會搜尋 S3 區段,而區段位移為 10 秒。 簡報時鐘從 10 秒開始, (區段位移) 。 位移不包含區段 S1 和 S2 的持續時間。 排序器來源會傳送一個 MESourceStarted 事件,其開始時間等於區段位移 10 秒。
在搜尋之後,如果播放會繼續下一個區段,轉換的運作方式就像先前的範例一樣,不同之處在于位移不包含略過的區段。
以下是一些會影響樣本時間戳記方式的進一步詳細資料:
- 解碼器可能需要超過媒體停止時間的資料。 管線會從來源提取的資料,因為解碼器需要,然後修剪解碼器的輸出範例。
- 轉換可能會緩衝處理資料。 例如,音訊效果可能需要這麼做。 當區段結束時,轉換最後一個樣本上的時間戳記早于區段結尾,因為轉換會保留某些資料。 下一個區段啟動時,第一個樣本上的時間戳記稍早于區段的開頭。 時間戳記中沒有間距,因此到達媒體接收的資料是連續的。 最終區段結束時,管線會清空轉換,因此不會遺失任何資料。
- 來源可能需要稍早啟動媒體開始時間,才能挑選上一個主要畫面格。 因此,調整之後,第一個樣本可能會有負面的呈現時間。
編輯序列
在編輯順序中,應用程式會藉由設定 MF_TOPOLOGY_PROJECTSTART 和 MF_TOPOLOGY_PROJECTSTOP 屬性,預先指定區段界限。 管線會以與播放清單序列相同的方式計算時間戳記的調整:
針對位移,它會使用 MF_TOPOLOGY_PROJECTSTART的值,而不是使用區段觀察到的結尾。
為了搜尋,位移使用等於區段 MF_TOPOLOGY_PROJECTSTART 值加上線段位移的值。
因此,即使應用程式尋求另一個區段,編輯序列中的簡報時間一律相對於簡報的開頭。
相關主題