共用方式為


新增效果和轉換物件

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

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

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

  • timeline 物件代表時間軸內的效果或轉換。 對於效果,時間軸物件支援 IAMTimelineEffect 介面。 針對轉換,它支援 IAMTimelineTrans 介面。 這兩種類型都支援 IAMTimelineObj 介面。
  • 子物件是實作效果或轉換資料處理的物件。 timeline 物件會保存子物件的指標。

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

1.建立 Timeline 物件

若要建立時程表物件,請呼叫 IAMTimeline::CreateEmptyNode 方法。 將類型設定為等於效果 的TIMELINE_MAJOR_TYPE_EFFECT ,或 設定轉換的TIMELINE_MAJOR_TYPE_TRANSITION

下列範例會建立轉換物件:

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

2.指定 Subobject

timeline 物件可作為另一個物件的包裝函式,稱為 子物件,它會執行實際工作。 子物件會實作產生所需效果或轉換的資料轉換。 如需 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();

使用效果和轉換