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