設定效果和轉換的屬性
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
[不支援此 API,未來可能會改變或無法使用。]
許多 DirectShow Editing Services 效果和轉換都支援控制其行為的屬性。 應用程式可以使用 IPropertySetter 介面來設定屬性的值。 基礎效果或轉換物件必須支援 IDispatch 來設定屬性。 透過視訊效果和轉換,應用程式可以設定隨著時間而變更的值範圍。 (例如,您可以設定抹除轉換,以在 frame.) 使用音訊效果時,屬性的值是靜態的,而且無法隨著時間變更。 唯一的例外是 Volume Envelope 效果,其支援磁片區層級的動態屬性。
若要設定屬性,請執行下列步驟。
- 建立屬性 setter 的實例 (CLSID_PropertySetter) 。
- 使用屬性資料填 入DEXTER_PARAM 和 DEXTER_VALUE 結構。 以下將討論這些結構。
- 將 DEXTER_PARAM 和 DEXTER_VALUE 結構傳遞至 IPropertySetter::AddProp 方法。
- 針對您想要設定的每個屬性重複步驟 2 和 3。
- 將 IPropertySetter 介面指標傳遞至 IAMTimelineObj::SetPropertySetter 方法。
DEXTER_PARAM結構會指定要設定的屬性。 其中包含下列成員。
- 名稱:屬性的名稱
- dispID:保留,必須是零
- nValues:值數目
DEXTER_VALUE 結構會指定指定時間的屬性值。 其中包含下列成員。
- v:VARIANT 類型,指定 屬性的新值。 此 VARIANT 的 vt 成員會定義 屬性的資料類型。 如需 VARIANT 類型的詳細資訊,請參閱 Windows SDK。
- rt:當屬性假設此值相對於效果或轉換的開始時間時,參考時間。 效果或轉換的開始時間相對於其父物件的開始時間。
- dwInterp:旗標,指定屬性從上一個值變更為新值的方式。 使用 DEXTERF_JUMP 旗標時,屬性會立即跳到指定時間的新值。 使用 DEXTERF_INTERPOLATE 旗標時,屬性會以線性方式從先前的值插補。
如果您將 vt 成員設定為 VT_BSTR,則屬性 setter 會進行任何必要的轉換。 針對浮點值,請在小數點之前包含前置零。 例如,0.3,而不是 .3。
注意
應用程式應該避免依賴從 BSTRs 轉換為數值的轉換。 如果屬性具有數值,可以使用適當的數值 VARIANT 類型。
屬性的值可能會隨著時間而變更,因此 IPropertySetter::AddProp 方法會採用單一 DEXTER_PARAM 結構,以及 DEXTER_VALUE 結構的陣列指標。 陣列會定義 屬性的一組以時間為基礎的值。 陣列的成員必須以遞增時間順序排列,而 DEXTER_PARAM 結構的 nValues 成員必須等於陣列的長度。
下列程式碼範例會建立 SMPTE 抹 除轉換的屬性資料。 它會將抹除程式碼設定為 120,以建立橢圓抹除。 它會將參考時間設定為零,表示轉換的開始。
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之前未在效果或轉換物件上設定任何屬性,則無法在圖形執行時將屬性新增至該物件。
相關主題