効果と画面切り替えにプロパティを設定する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
[この API はサポートされていないため、今後変更または使用できない可能性があります。]
DirectShow Editing Services の多くの効果と切り替えは、その動作を制御するプロパティをサポートしています。 アプリケーションは、 IPropertySetter インターフェイスを使用してプロパティの値を設定できます。 基になる効果または遷移オブジェクトは、プロパティを設定するための IDispatch をサポートしている必要があります。 ビデオ効果と画面切り替えを使用すると、アプリケーションは時間の経過と共に変化する値の範囲を設定できます。 (たとえば、ワイプの切り替えを設定して、フレーム間を行き来できます)。オーディオ効果では、 プロパティの値は静的であり、時間の経過と共に変更することはできません。 唯一の例外は、ボリューム レベルの動的プロパティをサポートするボリューム エンベロープ 効果です。
プロパティを設定するには、次の手順を実行します。
- プロパティ セッター (CLSID_PropertySetter) のインスタンスを作成します。
- DEXTER_PARAMおよびDEXTER_VALUE構造体にプロパティ データを入力します。 これらの構造については、以下で説明します。
- DEXTER_PARAMおよびDEXTER_VALUE構造体を IPropertySetter::AddProp メソッドに渡します。
- 設定するプロパティごとに手順 2 と 3 を繰り返します。
- IPropertySetter インターフェイス ポインターを IAMTimelineObj::SetPropertySetter メソッドに渡します。
DEXTER_PARAM構造体は、設定するプロパティを指定します。 これには、次のメンバーが含まれています。
- 名前: プロパティの名前
- dispID: 予約済み、0 である必要があります
- nValues: 値の数
DEXTER_VALUE構造体は、特定の時点でのプロパティの値を指定します。 これには、次のメンバーが含まれています。
- v: プロパティの新しい値を指定する VARIANT 型。 この VARIANT の vt メンバーは、 プロパティのデータ型を定義します。 VARIANT 型の詳細については、Windows SDK に関するページを参照してください。
- rt: 効果または遷移の開始時刻を基準にして、プロパティがこの値を前提とする参照時間。 効果または遷移の開始時刻は、その親オブジェクトの開始時刻を基準とします。
- dwInterp: プロパティが前の値から新しい値に変更される方法を指定するフラグ。 DEXTERF_JUMP フラグを使用すると、プロパティは指定した時刻に新しい値にすぐにジャンプします。 DEXTERF_INTERPOLATE フラグを使用すると、プロパティは前の値から直線的に補間されます。
vt メンバーを VT_BSTR に設定すると、プロパティ セッターは必要な変換を行います。 浮動小数点値の場合は、小数点の前に先頭の 0 を含めます。 たとえば、.3 ではなく 0.3 です。
注意
アプリケーションでは、 BSTRから数値への変換に依存しないようにする必要があります。 プロパティに数値がある場合は、適切な数値 VARIANT 型を使用できます。
プロパティの値は時間の経過と同時に変化する可能性があるため、 IPropertySetter::AddProp メソッドは 1 つの DEXTER_PARAM 構造体と 、DEXTER_VALUE 構造体の配列へのポインターを受け取ります。 配列は、 プロパティの時間ベースの値のセットを定義します。 配列のメンバーは昇順で、DEXTER_PARAM構造体の nValues メンバーは配列の長さと等しい必要があります。
次のコード例では、 SMPTE ワイプ 遷移のプロパティ データを作成します。 ワイプ コードを 120 に設定し、楕円形のワイプを作成します。 参照時間を 0 に設定し、遷移の開始を示します。
IPropertySetter *pProp; // Property setter
IAMTimelineObj *pTransObj; // Transition object
// Create an SMPTE Wipe transition object. (Not shown)
hr = CoCreateInstance(CLSID_PropertySetter, NULL, CLSCTX_INPROC_SERVER,
IID_IPropertySetter, (void**) &pProp);
// Error checking is omitted for clarity...
DEXTER_PARAM param;
DEXTER_VALUE *pValue = (DEXTER_VALUE*)CoTaskMemAlloc(sizeof(DEXTER_VALUE));
// Initialize the parameter.
param.Name = SysAllocString(L"MaskNum");
param.dispID = 0;
param.nValues = 1;
// Initialize the value.
pValue->v.vt = VT_I4;
pValue->v.lVal = 120; // Oval
pValue->rt = 0;
pValue->dwInterp = DEXTERF_JUMP;
pProp->AddProp(param, pValue);
// Free allocated resources.
SysFreeString(param.Name);
VariantClear(&(pValue->v));
CoTaskMemFree(pValue);
// Set the property on the transition.
pTransObj->SetPropertySetter(pProp);
pProp->Release();
プロパティを動的に変更する
ビデオ編集プロジェクトをレンダリングした後、グラフの実行中に効果または遷移オブジェクトのプロパティを変更できます。 ただし、これは、アプリケーションが IRenderEngine::ConnectFrontEnd を呼び出す前に、そのオブジェクトにプロパティを設定した場合にのみ可能です。 その場合は、効果または遷移で IAMTimelineObj::GetPropertySetter を呼び出し、プロパティをクリアまたは変更すると、グラフの実行中に変更が動的に行われます。 変更が行われる間に視覚的な異常が発生する可能性があるため、これはプレビューでのみ推奨されます。 プロジェクトをファイルに書き込むときにプロパティを変更しないでください。
ConnectFrontEnd を呼び出す前に効果オブジェクトまたは遷移オブジェクトにプロパティを設定しなかった場合、グラフの実行中にプロパティを追加することはできません。
関連トピック