共用方式為


新增效果和轉換物件

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngine以及媒體基礎中的音訊/視訊擷取功能 取代。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

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

在 DES 中,效果或轉換會以兩個 物件表示:

  • 時間軸物件 代表時間軸內的效果或轉換。 針對效果,時間軸物件支援 IAMTimelineEffect 介面。 針對轉換,它支援 IAMTimelineTrans 介面。 這兩種類型都支援 IAMTimelineObj 介面。
  • 子物件 是實作效果或轉換之數據處理的物件。 時間軸物件持有一個指向子物件的指標。

若要新增效果或轉換,請執行下列步驟。

1.建立 Timeline 物件

若要建立時程表物件,請呼叫 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,請將轉換停止時間設定為至少比來源停止時間早一個畫面。

4.將物件插入時間軸

若要將物件插入時程表,請根據物件類型,在父系上呼叫下列其中一種方法:

IAMTimelineEffectable::EffectInsBefore 方法中,您必須指定效果的優先順序。 當效果與相同物件重疊時,會依優先順序套用它們。 音量信封音訊效果是例外狀況;如需詳細資訊,請參閱 音量信封效果 參考資料。 在組合內,所有音軌都會在套用該組合中的音效之前混合。

因為轉換不能重疊在相同的物件上,所以它們沒有優先順序值。

下列範例會將轉換物件新增至曲目:

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

此範例會先查詢 IAMTimelineTransable 介面的追蹤物件,再呼叫 AddTrans。

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();

使用效果和轉換