DirectShow 編集サービスの時刻

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

[この API はサポートされていないため、今後変更または使用できない可能性があります。]

ビデオを編集するには、いくつかの重要なタイミングの概念を操作する必要があります。 次に例を示します。

  • 各クリップには継続時間があります。
  • クリップ、画面切り替え、効果は、プロジェクト内の特定の時刻に表示されます。
  • ビデオのフレーム レートは、1 秒あたりのフレーム数 (fps) で表されます。

DirectShow Editing Services (DES) には、時間とフレーム レートを設定または取得するさまざまなメソッドが用意されています。 これらの値の意味は、コンテキストによって異なります。

時間の値

パラメーターが時刻を表す場合は、次の 3 つの異なる意味が考えられます。

  • タイムライン時間: タイムラインの先頭を基準とした時間。 たとえば、クリップがタイムラインに 2 秒開始したり、タイムラインに 15 秒で切り替えたりすることがあります。 タイムラインによって最終的にレンダリングされるプロジェクトが決定されるため、タイムライン時間を "プロジェクト時間" と考えることもできます。
  • メディア時間: 通常の再生中に到達したファイルの先頭を基準としたソース ファイル内のポイント。 たとえば、10 秒のビデオ ファイルがある場合、ファイルの途中のポイントは 5 秒でメディア時間として表されます。
  • 親時刻: タイムライン内のオブジェクトに対する相対的な時間。 たとえば、オブジェクトがタイムラインで 8 秒から始まり、タイムラインで 10 秒から始まる別のオブジェクトが含まれている場合、子オブジェクトは親に対して 2 秒から開始されます。 仮想では、タイムラインを基準にして、時間 0 のすべての開始が追跡されます。 したがって、仮想トラック内のオブジェクトの場合、親時刻はタイムライン時間と等しくなります。

メディア時間は、ソース オブジェクトにのみ適用されます。 各ソース オブジェクトには、メディアの開始時刻とメディアの停止時間があります。 たとえば、10 秒のビデオ クリップがあり、クリップの中央から 5 秒のみを使用し、クリップから最初の 2 秒と最後の 3 秒をトリミングするとします。 クリップをプロジェクトに 20 秒表示する (通常の再生速度を想定する) 場合は、次の開始時刻と停止時間を指定します。

  • メディアの開始: 2 秒

  • メディア停止: 7 秒

  • タイムラインの開始: 20 秒

  • タイムラインの停止: 25 秒

    タイムラインにソース クリップを挿入する

フレーム レート

フレーム レートは、1 秒あたりのフレーム数で測定されるメディア ストリームの "速度" です。 時間値と同様に、フレーム レートの意味はコンテキストによって異なります。

  • 出力フレーム レート: グループによって定義される、最終的にレンダリングされるプロジェクトのフレーム レート。 プロジェクトをレンダリングすると、各グループは独自のフレーム レートを持つ個別のメディア ストリームになります。
  • ソース フレーム レート: ソース ファイルが最初に作成されたフレーム レート。 作成されたフレーム レートは、グループの出力フレーム レートと一致する必要はありません。 DES は、必要に応じてファイルを自動的にアップサンプリングまたはダウンサンプリングします。 ほとんどのメディア形式では、DES は形式を調べることでフレーム レートを決定できます。 DIB シーケンスは例外です。DIB シーケンスのフレーム レートを指定する必要があります。 (詳細については、「 ソースの操作」を参照してください)。

再生速度: プロジェクトに表示されるソース クリップの見かけの速度。 たとえば、10 秒のビデオは、タイムラインで 5 秒に収めることができます。 その結果、次の図に示すように、クリップの速度は 2 倍に増加します。

ソースの再生を高速化する

(オーディオ ソースでは、ピッチもシフトします。次の式は、ソース クリップの再生速度を決定します。

  • 再生速度 = (メディアの停止 – メディアの開始) / (タイムラインの停止 – タイムラインの開始)

これら 3 つのレートはそれぞれ、他のレートとは無関係であることに注意してください。

  • メディアの時間を調整することで、クリップの速度を上げたり遅くしたりできます。これは最終的な出力のフレーム レートには影響しません。
  • ファイルの再生速度に影響を与えることなく、出力フレーム レートを増減できます。
  • 同じグループ内で、作成されたフレーム レートが異なるソース ファイルを混在させることができます。DES は、グループのフレーム レートに合わせて各クリップをアップサンプリングまたはダウンサンプリングします。

プロジェクトをレンダリングすると、グループ フレーム レートによって決まる最も近いフレーム境界にすべての時間が丸められます。 たとえば、ビデオ グループのフレーム レートが 30 fps だとします。 各フレームは約 33 ミリ秒 (ミリ秒) です。 1.68 秒のソース クリップをタイム ゼロからタイムラインに追加するとします。 ソースはフレーム境界で正確に終了しないため、DES は停止時間を 1.6666 秒 (50 フレーム) に丸めます。 レンダリングされたプロジェクトで 1.68 秒を求める場合は、実際にはソースの末尾を過ぎて 51 番目のフレームにシークします。

ただし、DES はソースの停止時間を上書きしません。 後でグループ フレーム レートを変更したり、ソースをタイムラインの新しい場所に移動したりして、切り上げの方法が異なる場合があります。 したがって、DES は元の停止時間を保持し、必要な場合にのみ丸めます。 詳細については、「 IAMTimelineObj::FixTimes」を参照してください。

DirectShow Editing Services を使用したはじめに