共用方式為


設定效果和轉換的屬性

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

[不支援此 API,未來可能會改變或無法使用。]

許多 DirectShow Editing Services 效果和轉換都支援控制其行為的屬性。 應用程式可以使用 IPropertySetter 介面來設定屬性的值。 基礎效果或轉換物件必須支援 IDispatch 來設定屬性。 透過視訊效果和轉換,應用程式可以設定隨著時間而變更的值範圍。 (例如,您可以設定抹除轉換,以在 frame.) 使用音訊效果時,屬性的值是靜態的,而且無法隨著時間變更。 唯一的例外是 Volume Envelope 效果,其支援磁片區層級的動態屬性。

若要設定屬性,請執行下列步驟。

  1. 建立屬性 setter 的實例 (CLSID_PropertySetter) 。
  2. 使用屬性資料填 入DEXTER_PARAMDEXTER_VALUE 結構。 以下將討論這些結構。
  3. DEXTER_PARAMDEXTER_VALUE 結構傳遞至 IPropertySetter::AddProp 方法。
  4. 針對您想要設定的每個屬性重複步驟 2 和 3。
  5. 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之前未在效果或轉換物件上設定任何屬性,則無法在圖形執行時將屬性新增至該物件。

使用效果和轉換