IMediaSeeking::SetRate

SetRate メソッドは、再生レートを設定する。

構文

  HRESULT SetRate(
  double dRate
);

パラメータ

dRate

[in] 再生レート。ゼロであってはならない。

戻り値

HRESULT 値を返す。可能な値は次のとおりである。

説明
S_OK 成功。
E_INVALIDARG 指定したレートは、0 または負の値だった。「注意」を参照。
E_NOTIMPL 実装されていない。
E_POINTER NULL ポインタ引数。
VFW_E_UNSUPPORTED_AUDIO オーディオ デバイスあるいはフィルタがこのレートをサポートしていない。

注意

再生レートは、通常速度との比率で表現される。したがって、1.0 は通常の再生速度、0.5 は半分の速度、2.0 は 2 倍の速度を示す。オーディオ ストリームについては、レートを変えるとそのピッチも変わる。

負の値は逆方向の再生を示す。大部分のフィルタは逆再生をサポートせず、代わりに dRate 引数が負の場合はエラー コードを返す。

アプリケーションがこのメソッドをフィルタ グラフ マネージャで呼び出すと、フィルタ グラフ マネージャは以下のことを行う。

  1. IMediaSeeking::GetCurrentPosition メソッドを呼び出す。この呼び出しによってフィルタ グラフ マネージャが計算した現在位置を返す。
  2. (グラフがポーズあるいは実行中の場合) フィルタ グラフを停止する。
  3. 現在位置を開始タイムとして、フィルタで IMediaSeeking::SetPositions メソッドを呼び出す。これはストリーム タイムをゼロにリセットする結果となる。
  4. 新しいレートで、フィルタの SetRate メソッドを呼び出す。
  5. ポーズあるいは実行中だった場合、フィルタ グラフを再開する。

ステップ 4 でエラーが起きると、フィルタ グラフ マネージャは以前のレートを再び使おうとする。

フィルタは以下のようにレート変更に対応する必要がある。

パーサー フィルタとソース フィルタ : タイム スタンプを発生させているフィルタは SetRate 呼び出しに対応しなければならない。通常これは AVI スプリッタ フィルタのようなパーサー フィルタだが、ソース フィルタの場合もある。シークやレート変更の後、フィルタは IPin::NewSegment メソッドを新しい設定で呼び出す必要がある。レート変更の後、そのタイム スタンプを必要に応じて調整すべきである。レート変更はシークに優先するので、タイム スタンプはゼロから再スタートとなる。したがって、フィルタはそのレートで割った新しいタイム スタンプを計算できる。

**デコーダ フィルタ :**デコーダは SetRate 呼び出しに対して、それらをアップストリームに渡す以外のことを行ってはならない。代わりに、デコーダはアップストリーム パーサーが発行する NewSegment 呼び出しに対応すべきである。デコーダ フィルタが新しいセグメント情報を受け取るとき、そのフィルタはその値を保存して、NewSegment 呼び出しをダウンストリームに渡す。一部のデコーダはその入力を補間することによって追加タイム スタンプを生成する必要がある。その場合、レート変更を考慮する必要がある。

レンダラ : 受信フレームは既に正しいタイム スタンプを持っているので、ビデオ レンダラは通常レート変更を無視できる。オーディオ デコーダは通常レート変換を行わないので、オーディオ レンダラがその再生レートを変更する必要がある。

参照