効果オブジェクトと遷移オブジェクトの追加

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

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

DES では、効果または遷移は 2 つのオブジェクトで表されます。

  • タイムライン オブジェクトは、タイムライン内の効果または遷移を表します。 効果の場合、タイムライン オブジェクトは IAMTimelineEffect インターフェイスをサポートします。 遷移の場合は、 IAMTimelineTrans インターフェイスがサポートされます。 どちらの種類も IAMTimelineObj インターフェイスをサポートしています。
  • サブオブジェクトは、効果または遷移のデータ処理を実装するオブジェクトです。 タイムライン オブジェクトは、サブオブジェクトへのポインターを保持します。

効果または切り替えを追加するには、次の手順を実行します。

1. タイムライン オブジェクトを作成する

タイムライン オブジェクトを作成するには、IAMTimeline::CreateEmptyNode メソッドを呼び出します。 効果の 場合はTIMELINE_MAJOR_TYPE_EFFECT 、切り替えの 場合はTIMELINE_MAJOR_TYPE_TRANSITION に等しい型を設定します。

次の例では、遷移オブジェクトを作成します。

IAMTimelineObj *pTransObj = NULL;
pTimeline->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);

2. サブオブジェクトを指定する

タイムライン オブジェクトは、実際の作業を行うサブオブジェクトと呼ばれる別のオブジェクトのラッパーとして機能します。 サブオブジェクトは、目的の効果または遷移を生成するデータ変換を実装します。 DES で提供される画面切り替えと効果の一覧については、「 画面切り替えと効果」を参照してください。

サブオブジェクトを設定するには、タイムライン オブジェクトで IAMTimelineObj::SetSubObjectGUID メソッドを呼び出し、サブオブジェクトのクラス識別子 (CLSID) を渡します。 DirectShow には、CLSID の取得に使用できるビデオ効果とビデオ切り替えの列挙子が用意されています。 詳細については、「 効果と遷移の列挙」を参照してください。

次の例では、 SMPTE ワイプ遷移 をサブオブジェクトとして設定します。

hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg);  // SMPTE Wipe

3. 開始時刻と停止時刻を設定する

開始時刻と停止時刻を設定するには、 IAMTimelineObj::SetStartStop メソッドを 呼び出します。 これらの時間は、親オブジェクトの開始時刻を基準にしています。 効果は同じオブジェクト内で重なることがありますが、画面切り替えはできません。

次の例では、開始時刻を 5 秒に設定し、停止時間を 10 秒に設定します。

const REFERENCE_TIME ONE_SECOND = 10000000
hr = pTransObj->SetStartStop(5 * ONE_SECOND, 10 * ONE_SECOND);

遷移がレンダリングされると、各フレームでの遷移の進行状況は Progress プロパティに基づいて計算されます。これは、0.0 から 1.0 の範囲に正規化されます。 DES では、各フレームの開始時刻を使用して進行状況の値を計算します。 つまり、遷移停止時間がソース停止時間と等しい場合、最後のフレームの開始時刻が停止時間よりもわずかに多いため、 Progress 値が正確に 1.0 に達することはありません。 切り替えを 1.0 に達するには、移行停止時間をソース停止時間より少なくとも 1 フレーム早く設定します。

4. タイムラインにオブジェクトを挿入する

オブジェクトをタイムラインに挿入するには、オブジェクトの種類に応じて、親で次のいずれかのメソッドを呼び出します。

IAMTimelineEffectable::EffectInsBefore メソッドでは、効果の優先度を指定する必要があります。 同じオブジェクトに対して効果が重なると、優先度順に適用されます。 ボリュームエンベロープオーディオエフェクトは例外です。詳細については、 ボリューム エンベロープ効果 のリファレンスを参照してください。 コンポジション内では、そのコンポジションのオーディオエフェクトが適用される前に、すべてのオーディオトラックが混在します。

画面切り替えは同じオブジェクトで重複できないため、優先度の値はありません。

次の例では、トラックに遷移オブジェクトを追加します。

IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);  
pTransable->Release();

この例では、AddTrans を呼び出す前に、 IAMTimelineTransable インターフェイスの track オブジェクトに対してクエリを実行します。

5. プロパティを設定する

多くの効果と切り替えは、カスタム プロパティをサポートしています。 詳細については、「 効果と画面切り替え時のプロパティの設定」を参照してください。

次のコード例では、SMPTE ワイプ遷移をトラックに追加します。タイムラインにトラック オブジェクトが既に存在することを前提としています。

IAMTimeline *pTL;
IAMTimelineTrack *pTrack;

// Create timeline with track (not shown).

// Create the transition object. 
IAMTimelineObj *pTransObj = NULL;
hr = pTL->CreateEmptyNode(&pTransObj, TIMELINE_MAJOR_TYPE_TRANSITION);

// Set the subobject. 
hr = pTransObj->SetSubObjectGUID(CLSID_DxtJpeg);  // SMPTE Wipe

// Set the start and stop times. 
hr = pTransObj->SetStartStop(50000000, 100000000);

// Insert the transition object into the timeline. 
IAMTimelineTransable *pTransable = NULL;
hr = pTrack->QueryInterface(IID_IAMTimelineTransable, (void **)&pTransable);
hr = pTransable->TransAdd(pTransObj);  
pTransable->Release();
pTransObj->Release();

効果と画面切り替えの操作