時間戳記和持續時間

本主題描述 媒體基礎轉換 如何處理時間戳記。

MFT 必須盡可能在所有輸出範例上設定正確的時間戳記和持續時間。 對於採用一個輸入緩衝區並完全將其處理成輸出緩衝區的簡單 MFT,MFT 應該只直接將時間戳記和持續時間從輸入範例複製到輸出範例。 不過,許多轉換比這個複雜,而且可能需要更複雜的輸出時間計算。 所有 MFT 都應該觀察下列基本規則:

  • 如果輸入樣本上提供精確的時間戳記或持續時間,MFT 應該嘗試在所有未壓縮的視訊或音訊輸出樣本上放置時間戳記和持續時間,或可以計算。 某些輸出時間戳記可能需要插補,特別是解碼器。
  • 輸入樣本的時間戳記和持續時間應該盡可能保留在輸出樣本上。
  • 輸出時間戳記或持續時間可能不符合輸入,因為 MFT 會保留資料,或將輸出中斷成與輸入不同的大小片段。 在此情況下,MFT 應該從最早的輸入範例計算輸出時間戳記,其中包含用來建立輸出範例的資料。 若要計算輸出時間戳記,請將適當輸入樣本的輸入時間戳記新增至已從該樣本轉換的資料持續時間。 本節結尾的第二個範例說明這個概念。
  • 如果輸入樣本有持續時間,則應保留該持續時間。 如果輸入樣本沒有持續時間,則 MFT 應該盡可能從輸出緩衝區的大小或媒體類型所提供的資料速率計算持續時間。
  • 計算持續時間應該截斷 (舍入) ,而不是舍入到最接近的遞增。 管線有足夠的寬限時間來處理稍微不正確的持續時間,但管線處理持續時間比 1% 太長的時間更容易。 也就是說,除了四捨五入以外,沒有理由刻意縮短持續時間。

解碼器

解碼器會將壓縮的封包轉換成未壓縮的資料。 因為輸出未壓縮,解碼器必須有特殊義務,才能正確取得時間戳記和持續時間。 某些壓縮格式,尤其是 MPEG-2,在所有輸入封包上沒有時間戳記,而且在任何封包上通常沒有任何持續時間。 針對這些格式,解碼器負責在每個輸出樣本上放置有效的時間戳記和持續時間,方法是加總自上次時間戳記輸入範例以來所有輸出的隱含持續時間。

對於影片,如果持續時間無法使用壓縮格式,解碼器應該將持續時間計算為畫面播放速率的反轉,轉換為 100 奈秒單位並舍入。

對於音訊,如果持續時間無法使用壓縮格式,解碼器應該計算持續時間,因為音訊取樣率的反向乘以輸出緩衝區中的樣本數目,轉換為 100 奈秒單位,並舍入。

轉換應該輸出沒有時間戳記的樣本唯一時間是,如果 MFT 從未在輸入範例上收到時間戳記,或沒有辦法計算先前輸入時間戳記的精確輸出時間戳記。

音訊解碼器

對於音訊解碼器,每個輸出樣本的持續時間是從音訊取樣率計算,以及輸出緩衝區中每個通道的 PCM 樣本數目。

計算輸出時間戳記的正確方式取決於輸入樣本是否包含時間戳記。

如果輸入範例包含時間戳記,解碼器會從輸入時間戳記計算輸出時間戳記,如下所示:

  • 如果每個輸入緩衝區包含一或多個完整的壓縮框架,但沒有部分畫面格,則輸出時間戳記等於輸入時間戳記,減去解碼器的已知延遲。 例如,Dolby Digital (AC-3) 解碼器有 256 個 PCM 範例的延遲。 例如,在 48-kHz 取樣率中,延遲為 5.33 毫秒, (毫秒) 。 因此,如果輸入時間戳記為 1000 毫秒,則輸出時間戳記為 1000 – 5.33 = 994.66 毫秒。 如果輸入緩衝區包含一個以上的整個壓縮框架,解碼器會針對輸入範例中的每個框架產生一個輸出範例。 所有輸出範例都會正確戳記,因此沒有任何間距。
  • 視傳輸格式而定,輸入緩衝區可能包含部分畫面格。 例如,緩衝區可能包含上一個輸入緩衝區的框架部分,後面接著一或多個完整畫面格,後面接著下一個畫面格的開頭。 在此情況下,通常正確假設輸入時間戳記對應于緩衝區內開始的第一個畫面格。 (也就是說,在先前緩衝區中啟動的部分框架不會包含在目前緩衝區的時間戳記中。) 據以計算輸出時間戳記。

如果輸入範例不包含任何時間戳記:

  • 解碼器應該會產生自己的時間戳記,並將第一個輸出時間戳記設定為零。
  • 取樣持續時間是從緩衝區中的輸出樣本數目和取樣率計算。
  • 後續時間戳記是從先前的時間戳記和持續時間計算:目前的時間戳記 + 目前持續時間 = 下一個時間戳記。 輸出時間戳記中不應該有間距。

如果輸入資料流程一開始包含時間戳記,但基於某些原因,切換為沒有時間戳記,解碼器應該繼續產生自己的輸出時間戳記,如此一來,它們就會連續且沒有間距。

如果輸入資料流程包含時間戳記,但時間有間距,解碼器只會傳播這些間距。 換句話說,解碼器不應該嘗試修正輸入資料流程中的不一致時間戳記。

攪拌機

注意

在 Windows Vista 中,媒體基礎管線不支援具有多個輸入的 MFT。 Windows 7 支援多輸入 MFT。

 

混音器會採用多個輸入,並將其混合成一個輸出。 如果輸入資料流程未完全鎖定速率,或彼此稍微位移,則輸出上設定的時間可能會模棱兩可。 以下是一些指導方針,視媒體類型而定:

  • 音訊。 在啟動或立即清空或排清之後,音訊混音器應該等候產生輸出樣本,直到它收到所有必要輸入資料流程上的輸入樣本為止。 此時,它應該選擇初始範例的最早時間戳記,以作為輸出時間戳記的基準。 其他資料流程應該以無聲填補,以隨時構成不一致。 如果在選擇性輸入資料流程上收到樣本,則也應該納入計算中。 從該時間點開始,MFT 應該致力於產生連續且未中斷的輸出時間戳記鏈結。 一般而言,MFT 不應該嘗試考慮相對於另一個資料流程的漂移。 相反地,它應該從基準時間戳記、輸出速率和緩衝區大小計算輸出時間戳記。 發生另一個清空或排清時,MFT 應該重設其基準時間戳記。

  • 影片。 在啟動時或緊接在清空或排清之後,視訊混音器應該等候產生輸出樣本,直到在所有必要的輸入資料流程上收到輸入樣本為止。 此時,它應該選擇初始範例的最早時間戳記,以作為輸出時間戳記的基準。 一般而言,即使輸入不如一般,也應該盡可能保留連續和一般輸出時間戳記和固定持續時間,即使輸入不如一般,也視需要重複輸入畫面格。

編碼器

編碼器會將未壓縮的音訊或視訊轉換成壓縮封包。 編碼器應遵循下列指導方針:

  • 編碼器應遵循輸出格式的慣例。 如果格式通常不是每個樣本的時間戳記,如 MPEG-2 所示,則並非所有輸出樣本都必須有時間戳記和持續時間。

  • 如果輸入時間戳記具有時間戳記的欄位,則輸入時間戳記應該以輸出格式保留,除非其他來源提供更好的時間資訊,例如應用程式本身。

多工器

注意

在 Windows Vista 中,媒體基礎管線不支援具有多個輸入的 MFT。 Windows 7 支援多輸入 MFT。

 

多工器會將兩個不同的音訊或視訊串流合併成一個交錯格式,例如 AVI 或 MPEG-2 傳輸資料流程。 多工器應遵循下列指導方針:

  • 多工器應遵循輸出格式的慣例。 如果格式通常不是每個樣本的時間戳記,如 MPEG-2 所示,則並非所有輸出樣本都必須有時間戳記和持續時間。

  • 時間戳記應該反映要放在該封包中任何開始之畫面的最早時間,或從該封包解碼的第一個音訊樣本時間。 如果與輸出格式的慣例衝突,請忽略此指導方針。

Demultiplexers

解譯器會將交錯格式,例如 AVI 或 MPEG-2 傳輸資料流程分割成基礎音訊和視訊資料流程。

如果格式包含特定的時間戳記資訊,可用來根據輸入時間戳記來計算精確的輸出時間戳記,則應該使用該資訊。 不過,如果格式包含與輸入時間戳記無關之完全不同基底中的時間,而且無法計算輸入時間戳記的精確位移,則應該忽略格式自己的時間。

如果格式沒有可用的時間戳記資訊,解譯程式應該遵循下列規則:

  • 如果可能的話,未壓縮的輸出資料流程應該具有有效的時間戳記和持續時間,從最接近的先前輸入時間戳記計算。

  • 壓縮的輸出資料流程應該只有衍生自具有時間戳記之輸入範例的第一個輸出範例的時間戳記。 如果輸入範例沒有時間戳記,則衍生自該輸入範例的輸出樣本應該具有時間戳記。 如果輸入範例分成多個輸出範例,則只有第一個輸出範例應該有時間戳記,其餘部分應該沒有時間戳記。

範例

範例 1. 假設視訊效果一律採用未壓縮的輸入畫面、套用效果,並將它複製到輸出。 它絕不會保留任何畫面格或緩衝任何輸入。 如果輸入範例可用,此 MFT 只會將時間戳記和持續時間複製到輸出範例,而且完全沒有時間計算。

範例 2. 假設音訊效果會轉換每個輸入緩衝區 (毫秒) ,儲存額外的 10 毫秒以結合下一個緩衝區。 它會取得樣本串流,其持續時間全部為 50 毫秒。 下表顯示輸入時間。

範例 輸入時間 輸入持續時間 輸出時間 輸出持續時間
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

請注意樣本 2 的實際持續時間與根據下一個時間戳記 (121 的隱含持續時間之間的 1 毫秒差異?70 = 51) 。

因為 MFT 會保留 10 毫秒,所以會將輸入樣本 1 的前 40 毫秒輸出為輸出範例 1,時間戳記為 20 毫秒,持續時間為 40 毫秒。

輸出範例 2 結合了先前保留的 10 毫秒與 40 毫秒的輸入樣本 2。 此範例的時間戳記為 60 毫秒, (前一個輸入範例的時間戳記 20 毫秒,再加上該範例中已處理的資料持續時間,40 毫秒) 。 其持續時間為 50 毫秒。

同樣地,下一個範例的時間戳記為 110 毫秒, (70 毫秒 + 40 毫秒) ,持續時間為 50 毫秒。

下一個計算更有趣。 前一個輸出時間和持續時間的隱含時間戳記會是 160 毫秒 (時間戳記 110 毫秒 + 持續時間 50 毫秒) 。 不過,輸出時間戳記應該從最早輸入樣本的輸入時間戳記計算,以時間重迭輸出樣本,再加上從該樣本處理過的任何資料長度。 最接近的重迭輸入範例是範例 4 (時間戳記 = 171) ,但這不是最早的。 最早的重迭範例是範例 3 (時間戳記 = 121) 。 新增已從該樣本處理的 40 毫秒,結果為 161。

撰寫自訂 MFT