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