レート制御の実装

このトピックでは、カスタム パイプライン オブジェクトが、逆再生を含む可変再生レートをサポートする方法について説明します。 アプリケーションからのレート制御の使用については、「 レート制御」を参照してください。

このトピックは、次のセクションで構成されています。

Microsoft Media Foundation パイプライン オブジェクト (メディア ソース、変換、またはメディア シンク) を作成する場合は、可変再生レートをサポートする必要がある場合があります。 これを行うには、次のインターフェイスを実装します。

  1. IMFGetService インターフェイスを実装します。
  2. MF_RATE_CONTROL_SERVICE サービスをサポートします。 ( 「サービス インターフェイス」を参照)。
  3. オブジェクトでサポートされている再生レートを取得する IMFRateSupport インターフェイスを実装します。
  4. 再生速度を取得または設定する IMFRateControl インターフェイスを実装します。

メディア ソース

メディア ソースがレート制御をサポートしている場合は、 IMFRateSupportIMFRateControl の両方を実装する必要があります。 それ以外の場合、メディア セッションは、パイプライン内の他のコンポーネントに関係なく、最小および最大再生速度が 1.0 であることを報告します。

再生レートはサンプルのプレゼンテーション時間に影響しないため、メディア ソースはタイムスタンプを調整しないでください。 代わりに、プレゼンテーション クロックは高速または低速で実行されます。 逆再生の場合、ソースは逆順でサンプルを配信し、タイムスタンプを減らします。

IMFRateControl::SetRate メソッドの fThin パラメーターは、メディア ソースがコンテンツをシンする必要があるかどうかを示します。 間引きは主にビデオ ストリームに適用されます。 シンド モードでは、ソースはデルタ フレームをドロップし、キー フレームのみを配信します。 非常に高い再生レートでは、ソースは一部のキー フレームをスキップする場合があります (たとえば、他のすべてのキー フレームを配信します)。

ソースは、間引きモードでオーディオ サンプルを削除する必要はありません。 ただし、非常に高い再生レートでは、ソースはパイプラインのサンプル要求を満たすためにデータを高速に読み取ることができない可能性があります。 その場合、ソースでオーディオ データを削除する必要がある場合があります。 その場合は、ビデオ サンプルに近いオーディオ サンプルを配信する必要があります (ソースに両方の種類のストリームがある場合)。

ストリームが間引きモードと非シンモードの間で遷移すると、 MEStreamThinMode イベントが送信されます。

メディア ソースが SetRate の呼び出しを完了すると、 MESourceRateChanged イベントが送信されます

逆再生中:

  • メディア ソースは、タイム スタンプを調整せずに、サンプルを逆の順序で配信します。
  • ストリーム内のタイム スタンプは、単調に減少する必要があります。
  • コンテンツの先頭はストリームの末尾と見なされます。 各メディア ストリームがストリームの最初のサンプル (つまり、プレゼンテーション時間 = 0) を配信すると、 MEEndOfStream イベントが送信されます。

Media Foundation の変換

一般に、Media Foundation 変換 (MFT) では、MFT が非シンド リバース再生を実装しない限り、レート制御を明示的にサポートする必要はありません。

MFT が IMFRateSupport インターフェイスを実装していない場合、メディア セッションは次のことを前提としています。

  • MFT では、前方再生用のアービタリ再生レートがサポートされています(間引きと非シンの両方)。
  • MFT はシンインされたリバース再生をサポートしますが、シンされていない逆再生はサポートしていません。

これらの条件のいずれかが当てはまらない場合、MFT は IMFRateSupportIMFRateControl を実装する必要があります。

再生の反転

パイプライン内の 1 つ以上の変換でリバース再生が明示的にサポートされていない場合でも、メディア セッションは逆再生できます。

MFT が IMFRateSupport インターフェイスを公開しない場合、メディア セッションでは、次のように逆再生に 間引き が使用されます。

  • メディア セッションは、 IMFTransform::P rocessInput を呼び出すことによって、通常の方法で MFT にキー フレームを送信します。

  • メディア セッションはデルタ フレームを削除し、 MEStreamTick イベントに置き換えます。

  • 各サンプルの間で、メディア セッションは MFT をフラッシュして、タイム スタンプが減少しているという事実によって発生するエラーを回避します。

サンプルは、 MFSampleExtension_CleanPoint 属性が TRUE に設定されている場合はキー フレームと見なされ、この属性が FALSE または設定されていない場合はデルタ フレームと見なされます。

MFT で IMFRateSupport が実装されている場合、メディア セッションはこのインターフェイスを使用して、MFT が非シン化逆再生をサポートしているかどうかを検出します。 MFT で非シン化逆再生がサポートされている場合、メディア セッションは、サンプルをドロップしたり MFT をフラッシュしたりすることなく、すべてのサンプルを逆の順序で配信します。

MFT でシンされていない逆再生がサポートされている場合は、 IMFRateControl インターフェイスを実装する必要があります。 メディア セッションはこのインターフェイスを使用して、逆再生が発生したときに MFT に通知します。 その時点で、タイム スタンプが減少し、デルタ フレームが逆の順序で到着するように MFT を準備する必要があります。 デコーダーは通常、画像のグループ全体 (GOP) を受け取るまでサンプルをバッファーに格納し、GOP 全体をデコードし、デコードされたフレームを正しい (逆の) 順序で出力する必要があります。

メディア シンク

メディア シンクが レートレスの場合、メディア セッションでは、メディア シンクが任意の再生レートを処理できると想定されます。 メディア シンクは 、IMFRateSupport を実装する必要はありません。 (レートレス メディア シンクは、 IMFMediaSink::GetCharacteristics メソッドからMEDIASINK_RATELESS フラグを返します)。

それ以外の場合、メディア シンクは、1.0 以外の再生レートを処理できる場合は、 IMFRateSupport を実装する必要があります。

メディア シンクでは 、IMFRateControl を実装しないでください。 再生レートが変化すると、プレゼンテーション クロックはメディア シンクの IMFClockStateSink::OnClockSetRate メソッドを 呼び出します。

レート制御

シーク、早送り、リバース プレイ