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 引数が負の場合はエラー コードを返す。
アプリケーションがこのメソッドをフィルタ グラフ マネージャで呼び出すと、フィルタ グラフ マネージャは以下のことを行う。
- IMediaSeeking::GetCurrentPosition メソッドを呼び出す。この呼び出しによってフィルタ グラフ マネージャが計算した現在位置を返す。
- (グラフがポーズあるいは実行中の場合) フィルタ グラフを停止する。
- 現在位置を開始タイムとして、フィルタで IMediaSeeking::SetPositions メソッドを呼び出す。これはストリーム タイムをゼロにリセットする結果となる。
- 新しいレートで、フィルタの SetRate メソッドを呼び出す。
- ポーズあるいは実行中だった場合、フィルタ グラフを再開する。
ステップ 4 でエラーが起きると、フィルタ グラフ マネージャは以前のレートを再び使おうとする。
フィルタは以下のようにレート変更に対応する必要がある。
パーサー フィルタとソース フィルタ : タイム スタンプを発生させているフィルタは SetRate 呼び出しに対応しなければならない。通常これは AVI スプリッタ フィルタのようなパーサー フィルタだが、ソース フィルタの場合もある。シークやレート変更の後、フィルタは IPin::NewSegment メソッドを新しい設定で呼び出す必要がある。レート変更の後、そのタイム スタンプを必要に応じて調整すべきである。レート変更はシークに優先するので、タイム スタンプはゼロから再スタートとなる。したがって、フィルタはそのレートで割った新しいタイム スタンプを計算できる。
**デコーダ フィルタ :**デコーダは SetRate 呼び出しに対して、それらをアップストリームに渡す以外のことを行ってはならない。代わりに、デコーダはアップストリーム パーサーが発行する NewSegment 呼び出しに対応すべきである。デコーダ フィルタが新しいセグメント情報を受け取るとき、そのフィルタはその値を保存して、NewSegment 呼び出しをダウンストリームに渡す。一部のデコーダはその入力を補間することによって追加タイム スタンプを生成する必要がある。その場合、レート変更を考慮する必要がある。
レンダラ : 受信フレームは既に正しいタイム スタンプを持っているので、ビデオ レンダラは通常レート変更を無視できる。オーディオ デコーダは通常レート変換を行わないので、オーディオ レンダラがその再生レートを変更する必要がある。
参照