表示時間のシーケンス
このトピックでは、Sequencer ソース が再生中のプレゼンテーション時間を処理する方法について説明します。
概要
シーケンサーソースは、プレイリストシーケンスと編集シーケンスの2つの異なるモードをサポートしています。
編集シーケンスでは、アプリケーションは、再生を開始する前に、各セグメントの期間を事前に指定します。 プレイリストシーケンスでは、アプリケーションは事前に期間を指定しません。 (実際には、期間が不明な場合があります)。
どちらの場合も、セグメントのメディア開始時間とメディア停止時間を指定できます。 これらの時間は、セグメントが開始および終了するソース ファイル内の位置を指定します。 たとえば、ソース ファイルの長さが 90 秒であるとします。 最初の 10 秒と最後の 10 秒をトリミングする場合は、次の値を指定します。
- メディアの開始: 10 秒
- メディア停止: 80 秒
メディアの開始時刻を指定するには、ソース ノードで MF_TOPONODE_MEDIASTART 属性を設定します。 メディアの停止時間を指定するには、ソース ノードで MF_TOPONODE_MEDIASTOP 属性を設定します。
編集シーケンスを作成するには、メディア セッションの作成時に MF_SESSION_GLOBAL_TIME 属性を設定します。 それ以外の場合、メディア セッションはプレイリスト シーケンスを想定します。 編集シーケンスでは、すべてのセグメント トポロジに MF_TOPOLOGY_PROJECTSTART 属性と MF_TOPOLOGY_PROJECTSTOP 属性が必要です。
プレイリストシーケンス
プレイリスト シーケンスでは、プレゼンテーション クロックは 0 から始まり、セグメント境界を越えて続行されます。 ネイティブ ソースは、メディア時刻と等しいタイム スタンプを含むサンプルを提供します。 パイプラインは、次のようにタイムスタンプを正しいプレゼンテーション時刻に変換します。
- 新しいタイム スタンプ = メディア時間 + オフセット - メディアの開始
オフセット 値は、前のセグメントが終了したプレゼンテーション時間です。 最初のセグメントの場合、オフセットは 0 です。 これらのタイムスタンプ変換の計算方法の 2 つの例を次に示します。
- 例 1: 最初のセグメント (S1) の長さが 10 秒で、2 番目のセグメント (S2) のメディア開始時刻が 0 であるとします。 ネイティブ ソースでは、タイム スタンプにメディア時間が使用されるため、S2 からの最初のサンプルのタイム スタンプは 0 になります。 オフセットは 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 値にセグメント オフセットを加えた値を使用します。
したがって、アプリケーションが別のセグメントをシークする場合でも、編集シーケンス内のプレゼンテーション時間は常にプレゼンテーションの開始に対して相対的になります。
関連トピック
-
sequencer ソース の