Share via


タイム スタンプ

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

タイム スタンプは、メディア サンプルの開始時刻と終了時刻を定義し、ストリーム時間で測定します。 タイム スタンプは、 プレゼンテーション時間と呼ばれることもあります。 この記事の残りの部分を読むときは、すべての形式で同じ方法でタイムスタンプが使用されるわけではないことに注意することが重要です。 たとえば、すべての MPEG サンプルにタイムスタンプが設定されているわけではありません。 MPEG フィルター グラフでは、タイムスタンプはデコーダーから出力されるまで、各フレームに適用されません。

レンダラー フィルターは、サンプルを受け取ると、タイムスタンプに基づいてレンダリングをスケジュールします。 サンプルが遅れて到着した場合、またはタイムスタンプがない場合、フィルターはサンプルをすぐにレンダリングします。 それ以外の場合、フィルターはサンプルの開始時刻まで待機してからサンプルをレンダリングします。 ( IReferenceClock::AdviseTime メソッドを呼び出して開始時刻を待機します)。

ソース フィルターとパーサー フィルターは、処理するサンプルに正しいタイム スタンプを設定する役割を担います。 次のガイドラインを使用します。

  • ファイルの再生: 最初のサンプルには、開始時刻が 0 のタイムスタンプが付けられます。 後続のタイムスタンプは、サンプルの長さと再生速度によって決まります。それ自体はファイル形式によって決まります。 ファイルを解析するフィルターは、正しいタイムスタンプ ( AVI スプリッターなど) を計算します。
  • ビデオとオーディオのキャプチャ: すべてのサンプルには、キャプチャされたストリーム時間と等しい開始時刻がタイムスタンプされ、次の注意事項があります。
    • プレビュー ピンからのビデオ フレーム (キャプチャ ピンとは異なり) には、タイム スタンプが設定されません。 グラフの待機時間のため、キャプチャ時間が設定されたビデオ フレームは、常にビデオ レンダラーに遅れて到着します。 これにより、レンダラーが品質制御を試みるためにフレームをドロップする可能性があります。 品質管理の詳細については、「 品質管理管理」を参照してください。
    • オーディオ キャプチャ: オーディオ キャプチャ フィルターは、オーディオ ドライバーで使用されるものとは別のバッファーの独自のセットを使用します。 オーディオ ドライバーは、一定の間隔でキャプチャ フィルターのバッファーを埋めます。 間隔はドライバーによって異なりますが、通常は 10 ミリ秒以下です。 オーディオ サンプルのタイム スタンプには、ドライバーがオーディオ キャプチャ フィルターのバッファーに入力した時間が反映されます。 これらの時間は、アプリケーションで非常に小さいバッファー サイズを使用している場合は特に、少し不正確になる可能性があります。 ただし、メディア時間は、バッファー内のオーディオ サンプルの数を正確に反映します。
  • 多重化フィルター: 出力形式によっては、mux フィルターでタイム スタンプを生成する必要がある場合や、生成されない場合があります。 たとえば、AVI ファイル形式では、タイムスタンプのない固定フレーム レートが使用されるため、 AVI Mux フィルターはサンプルがほぼ適切なタイミングで到着していることを前提としています。 ただし、受信タイムスタンプに 1 フレームより大きいギャップが表示される場合、AVI Mux は、ドロップされたフレームを示すために、サイズ 0 のインデックス エントリを書き込みます。 ファイルの再生時に、前に説明したように、実行時に新しいタイムスタンプが生成されます。

サンプルにタイム スタンプを設定するには、 IMediaSample::SetTime メソッドを呼び出します。

メディア タイム

必要に応じて、フィルターでサンプルの メディア時間 を指定することもできます。 ビデオ ストリームでは、メディア時間はフレーム番号を表します。 オーディオ ストリームでは、メディア時間はパケット内のサンプル番号を表します。 たとえば、各パケットに 44.1 キロヘルツ (kHz) オーディオの 1 秒が含まれている場合、最初のパケットのメディア開始時刻は 0、メディア停止時間は 44100 になります。 シーク可能なストリームでは、メディア時間は常にストリームの開始時刻を基準とします。 たとえば、15 fps のビデオ ストリームの開始から 2 秒をシークするとします。 シーク後の最初のメディア サンプルのタイム スタンプは 0 ですが、メディア時間は 30 です。

レンダラーと多重化フィルターでは、ギャップを確認することで、メディア時間を使用してフレームまたはサンプルが削除されたかどうかを判断できます。 ただし、メディア時間を設定するためにフィルターは必要ありません。 サンプルのメディア時間を設定するには、 IMediaSample::SetMediaTime メソッドを呼び出します。

DirectShow の時刻と時計