DirectShow 編集サービスにおける時間
ビデオを編集するためには、時間に関する重要な概念をいくつか扱わなければならない。次に例を示す。
- 各クリップには、時間幅がある。
- クリップ、トランジション、エフェクトは、プロジェクト内の特定の時点で開始される。
- ビデオには、毎秒のフレーム数 (fps) で表されるフレーム レートがある。
Microsoft® DirectShow® 編集サービス (DES) は、時間やフレーム レートの設定や取得に使うさまざまなメソッドを提供する。これらの値の意味は、状況によって異なる。
時間の値
パラメータが時間を表す場合、3 とおりの意味がある。
- タイムライン タイム : タイムラインの始点からの相対時刻。たとえば、あるクリップはタイムラインにおいて 2 秒の時点で始まる。あるトランジションはタイムラインにおいて 15 秒の時点で発生するなど。タイムラインによって最終的にレンダリングされるプロジェクトが決まるので、タイムライン タイムを "プロジェクト時間" と考えることもできる。
- メディア タイム : ソース ファイル内で、通常の再生において達する、ファイルの先頭からの相対位置。たとえば、10 秒間のビデオ ファイルがある場合、ファイルの中間地点は、メディア タイムで表すと 5 秒の位置にある。
- 親タイム : タイムライン内のオブジェクトからの相対時刻。たとえば、あるオブジェクトがタイムライン上で 8 秒の位置で始まり、そのオブジェクトに含まれる別のオブジェクトがタイムライン上で 10 秒の位置で始まる場合、子オブジェクトは親から 2 秒の相対位置で始まることになる。仮想トラックはすべて、タイムラインからの相対時刻ゼロから始まる。したがって、仮想トラック内のオブジェクトについては、親タイムとタイムライン タイムは等しくなる。
メディア タイムは、ソース オブジェクトにのみ適用される。各ソース オブジェクトには、メディア開始タイムとメディア終了タイムがある。たとえば、10 秒間のビデオ クリップがあり、クリップの途中の 5 秒間だけを使いたい場合、クリップから最初の 2 秒と最後の 3 秒をトリミングする。このクリップをプロジェクト内で (通常の再生速度で) 20 秒の位置から開始したい場合は、開始タイムと終了タイムを次のように指定することになる。
メディア開始タイム : 2 秒
メディア終了タイム : 7 秒
タイムライン開始タイム : 20 秒
タイムライン終了タイム : 25 秒
フレーム レート
フレーム レートは、メディア ストリームの "速度" であり、毎秒のフレーム数で計測される。時間値の場合と同様に、フレーム レートの意味は状況によって異なる。
- 出力フレーム レート : 最終的にレンダリングされたプロジェクトのフレーム レート。グループによって定義される。プロジェクトをレンダリングすると、各グループはそれぞれ固有のフレーム レートを持つ個別のメディア ストリームになる。
- ソース フレーム レート : ソース ファイルが作成されたときのフレーム レート。作成時のフレーム レートは、グループの出力フレーム レートと一致していなくてもよい。DES では、必要に応じてファイルのアップサンプルまたはダウンサンプルを自動的に行う。ほとんどのメディア フォーマットについて、DES はフォーマットを調べてフレーム レートを特定できる。DIB シーケンスだけは例外で、そのフレーム レートはユーザーが指定しなければならない。詳細については、「ソースの操作」を参照すること。
再生レート : ソース クリップがプロジェクト内で始まるときの再生速度。たとえば、10 秒間のビデオをタイムライン上の 5 秒間に収めることができる。その場合、次の図で示すように、このクリップの速度は 2 倍になる。
オーディオ ソースの場合は、ピッチもシフトする。ソース クリップの再生レートは、次の式によって求められる。
- 再生レート = (メディア終了タイム - メディア開始タイム) / (タイムライン終了タイム - タイムライン開始タイム)
以上の 3 種類のレートは、それぞれ他とは独立している点に注意すること。
- メディア タイムを調整することにより、クリップの速度の上げ下げができる。これは、最終出力のフレーム レートには影響しない。
- ファイルの再生速度に影響を与えずに、出力フレーム レートの上げ下げができる。
- 同じグループ内では、作成時のフレーム レートが異なるソース ファイルを混在させることができ、DES は各クリップのアップサンプルまたはダウンサンプルを行って、グループのフレーム レートに一致させる。
プロジェクトをレンダリングするときに、すべての時間は、グループのフレーム レートによって決まる最も近いフレーム境界に丸められる。たとえば、ビデオ グループのフレーム レートが 30 fps であるとする。各フレームはほぼ 33 ミリ秒 (ms) であるとする。ここで、タイムラインに対して 1.68 秒のソース クリップを追加し、このクリップは時間ゼロから始まるとする。このソースは、フレーム境界ちょうどでは終了しないので、DES は終了タイムを 1.6666 秒 (50 フレーム) に丸める。レンダリング後のプロジェクトで 1.68 秒の位置を調べた場合、実際にはソースが終了した "後" (51 番目のフレーム) を調べることになる。
ただし、DES はソースの終了タイムを書き換えることはしない。後でグループのフレーム レートを変更するか、ソースをタイムライン内の別の位置に移動した場合には、時間を丸めた結果は異なるものになる。そのため、DES は元の終了タイムを維持し、必要なときにのみ丸めを行う。詳細については、「IAMTimelineObj::FixTimes」を参照すること。