新增效果和轉換物件
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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();
相關主題