レート制御の実装
このトピックでは、カスタム パイプライン オブジェクトが、逆再生を含む可変再生レートをサポートする方法について説明します。 アプリケーションからのレート制御の使用については、「 Rate Control」を参照してください。
このトピックは、次のセクションで構成されています。
Microsoft Media Foundation パイプライン オブジェクト (メディア ソース、変換、またはメディア シンク) を作成する場合は、可変再生レートをサポートすることが必要になる場合があります。 これを行うには、次のインターフェイスを実装します。
- IMFGetService インターフェイスを実装します。
- MF_RATE_CONTROL_SERVICE サービスをサポートします。 ( を参照してくださいサービス インターフェイス.)
- IMFRateSupport インターフェイスを実装します。このインターフェイスは、オブジェクトでサポートされている再生レートを取得します。
- 再生速度を取得または設定する IMFRateControl インターフェイスを実装します。
メディア ソース
メディア ソースがレート制御をサポートしている場合は、 IMFRateSupport と IMFRateControl の両方を実装する必要があります。 それ以外の場合、メディア セッションは、パイプライン内の他のコンポーネントに関係なく、最小および最大再生速度が 1.0 であることを報告します。
再生速度はサンプルのプレゼンテーション時間には影響しないため、メディア ソースはタイムスタンプを調整しないでください。 代わりに、プレゼンテーション クロックは高速または低速で実行されます。 逆再生の場合、ソースはタイム スタンプを減らしながら、サンプルを逆順に配信します。
IMFRateControl::SetRate メソッドの fThin パラメーターは、メディア ソースがコンテンツするかどうかを示します。 間引きは主にビデオ ストリームに適用されます。 シンド モードでは、ソースは差分フレームをドロップし、キー フレームのみを配信します。 非常に高い再生レートでは、ソースは一部のキー フレームをスキップする可能性があります (たとえば、他のすべてのキー フレームを配信する)。
ソースは、シンド モードでオーディオ サンプルを削除する必要はありません。 ただし、非常に高い再生レートでは、ソースはパイプラインのサンプル要求を満たすのに十分な速度でデータを読み取ることができない可能性があります。 その場合、ソースでオーディオ データの削除が必要になる場合があります。 その場合は、ビデオ サンプルに間に合ったオーディオ サンプルの配信を試みる必要があります (ソースに両方の種類のストリームがある場合)。
シンモードと非シンモードの間でストリームが遷移すると、 MEStreamThinMode イベントが送信されます。
メディア ソースは、 SetRate の呼び出しを完了すると、 MESourceRateChanged イベントを送信します。
逆再生中:
- メディア ソースは、タイム スタンプを調整せずに、逆の順序でサンプルを配信します。
- ストリーム内のタイム スタンプは、単調に減少する必要があります。
- コンテンツの先頭はストリームの末尾と見なされます。 各メディア ストリームがストリームの最初のサンプル (つまり、プレゼンテーション時間 = 0) を配信すると、 MEEndOfStream イベントが送信されます。
メディア ファンデーション変換
一般に、Media Foundation 変換 (MFT) では、MFT が非シンドリバース再生を実装しない限り、レート制御を明示的にサポートする必要はありません。
MFT が IMFRateSupport インターフェイスを実装していない場合、メディア セッションでは次のことが想定されます。
- MFT では、前方再生用のアービタリ再生レートがサポートされています。シンと非シンの両方がサポートされます。
- MFT ではシン反転再生がサポートされますが、非シンリバース再生はサポートされていません。
これらの条件のいずれかが当てはまらない場合、MFT は IMFRateSupport および IMFRateControl を実装する必要があります。
逆再生
パイプライン内の 1 つ以上の変換でリバース再生が明示的にサポートされていない場合でも、メディア セッションは逆再生できます。
MFT が IMFRateSupport インターフェイスを公開しない場合、メディア セッションでは、次のように、 thinning を使用して逆再生します。
メディア セッションは、 IMFTransform::P rocessInput を呼び出すことによって、通常の方法で MFT にキー フレームを送信します。
メディア セッションはデルタ フレームを削除し、 MEStreamTick イベントに置き換えます。
各サンプルの間で、メディア セッションは MFT をフラッシュし、タイム スタンプが減っていることによって発生するエラーを回避します。
サンプルは、 MFSampleExtension_CleanPoint 属性が TRUE に設定されている場合はキー フレームと見なされ、この属性が FALSE または設定されていない場合はデルタ フレームと見なされます。
MFT が IMFRateSupport を実装している場合、メディア セッションはこのインターフェイスを使用して、MFT が非シンドリバース再生をサポートしているかどうかを検出します。 MFT でシン化されていない逆再生がサポートされている場合、メディア セッションでは、サンプルをドロップしたり、MFT をフラッシュしたりすることなく、すべてのサンプルを逆の順序で配信します。
MFT が非シン反転再生をサポートしている場合は、 IMFRateControl インターフェイスを実装する必要があります。 メディア セッションでは、このインターフェイスを使用して、逆再生が発生したときに MFT に通知します。 その時点で、タイム スタンプが減少し、デルタ フレームが逆の順序で到着するように MFT を準備する必要があります。 デコーダーは通常、画像グループ全体 (GOP) を受け取るまでサンプルをバッファーし、GOP 全体をデコードし、デコードされたフレームを正しい (逆の) 順序で出力する必要があります。
メディア シンク
メディア シンクが レートレス場合、メディア セッションはメディア シンクが任意の再生速度を処理できることを前提としています。 メディア シンクは、 IMFRateSupportを実装する必要はありません。 (レートレス メディア シンクは、 からMEDIASINK_RATELESS フラグを返しますIMFMediaSink::GetCharacteristics メソッド。)
それ以外の場合、メディア シンクは、1.0 以外の再生レートを処理できる場合はIMFRateSupport を実装する必要があります。
メディア シンクでは、 IMFRateControl を実装しないでください。 再生速度が変化すると、プレゼンテーション クロックはメディア シンクの IMFClockStateSink::OnClockSetRate メソッドを呼び出します。
関連トピック