IMFMediaSource::Start 方法 (mfidl.h)
藉由指定開始播放的位置,啟動、搜尋或重新啟動媒體來源。
語法
HRESULT Start(
[in] IMFPresentationDescriptor *pPresentationDescriptor,
[in] const GUID *pguidTimeFormat,
[in] const PROPVARIANT *pvarStartPosition
);
參數
[in] pPresentationDescriptor
媒體來源簡報描述元之 IMFPresentationDescriptor 介面的指標。 若要取得簡報描述元,請呼叫 IMFMediaSource::CreatePresentationDescriptor。 您可以在呼叫 Start 之前修改簡報描述元,以選取或取消選取數據流或變更媒體類型。
[in] pguidTimeFormat
指定時間格式之 GUID 的指標。 時間格式會定義 pvarStartPosition 參數的單位。 如果值為 GUID_NULL,則時間格式為 100 奈秒單位。 某些媒體來源可能支持額外的時間格式 GUID。 此參數可以是 Null。 如果值為 NULL,則相當於 GUID_NULL。
[in] pvarStartPosition
指定開始播放的位置。 此參數的單位是以 pguidTimeFormat 中指定的時間格式來表示。 如果時間格式 GUID_NULL,則變體類型必須 VT_I8 或 VT_EMPTY。 使用 VT_I8 以 100 奈秒單位指定新的起始位置。 使用 VT_EMPTY 從目前位置開始。 其他時間格式可能會使用其他 PROPVARIANT 類型。
傳回值
方法會傳回 HRESULT。 可能的值包括 (但不限於) 下表中的這些值。
傳回碼 | 描述 |
---|---|
|
此方法已成功。 |
|
開始位置超過簡報結尾, (ASF 媒體來源) 。 |
|
硬體裝置無法啟動串流處理。 這個錯誤碼可由代表硬體裝置的媒體來源傳回,例如相機。 例如,如果相機已經由另一個應用程式使用,此方法可能會傳回這個錯誤碼。 |
|
啟動要求無效。 例如,開始位置超過簡報的結尾。 |
|
已呼叫媒體來源的 Shutdown 方法。 |
|
媒體來源不支援 pguidTimeFormat 中指定的時間格式。 |
備註
這個方法是非同步方法。 如果作業成功,媒體來源會傳送下列事件:
- 針對每個新的數據流,來源會傳送 MENewStream 事件。 此事件會針對數據流出現的第一個 開始 呼叫傳送。 事件數據是數據流 之IMFMediaStream 介面的指標。
- 針對每個 更新 的數據流,來源會傳送 MEUpdatedStream 事件。 例如,如果應用程式在播放期間搜尋) ,則當呼叫 Start 時已有數據流 (,就會更新數據流。 事件數據是數據流 之IMFMediaStream 介面的指標。
- 如果先前的狀態已停止,來源會傳送 MESourceStarted 事件。
- 如果先前的狀態已啟動或暫停,而起始位置是目前的位置 (VT_EMPTY) ,來源就會傳送 MESourceStarted 事件。
- 如果先前的狀態已啟動或暫停,而且指定了新的起始位置,來源就會傳送 MESourceSeeked 事件。
- 如果來源傳送 MESourceStarted 事件,則每個媒體數據流都會傳送 MEStreamStarted 事件。 如果來源傳送 MESourceSeeked 事件,則每個數據流都會傳送 MEStreamSeeked 事件。
如果先前的狀態已啟動或暫停,且新的起始位置未VT_EMPTY,則呼叫 Start 會導致搜尋。 並非所有媒體來源都可以搜尋。 如果媒體來源可以搜尋, IMFMediaSource::GetCharacteristics 方法會傳回 MFMEDIASOURCE_CAN_SEEK 旗標。
來自媒體來源的事件不會與來自媒體數據流的事件同步處理。 因此,如果您搜尋媒體來源,在取得 MESourceSeeked 事件之後,仍然可以從先前的位置接收樣本。 如果您需要同步處理作業,請等候串流事件 MEStreamSeeked,這會標示搜尋發生所在數據流中的確切點。
結束 Stream
當數據流播放至結尾時,數據流會傳送 MEEndOfStream 事件。 當所有選取的數據流都到達結尾時,媒體來源會傳送 MEEndOfPresentation 事件。如果開始位置超過選取數據流結尾 (,但在簡報結尾) 之前,數據流應該會在MEStreamStarted/MEStreamSeeked之後立即傳送MEEndOfStream。 如果播放到達簡報的結尾,而且從目前的位置再次呼叫 Start ,數據流會重新傳送 MEEndOfStream 事件,而媒體來源會重新傳送 MEEndOfPresentation 事件。 這些事件會通知管線不要要求更多數據。
在反向播放期間,檔案的開頭會被視為數據流的結尾。 如需詳細資訊,請參閱 實作速率控制。
實作開始
當媒體來源執行搜尋時,它應該從搜尋時間之前的第一個主要畫面格開始,讓譯碼器可以譯碼目標開始時間的範例。 管線會捨棄任何太早譯碼的樣本。如果開始時間 VT_EMPTY 且先前的狀態已啟動或暫停,來源應該會從目前的位置繼續。 在此情況下,不需要重新傳送上一個主要畫面格,因為譯碼器仍然會有先前傳送的數據。
驗證 pPresentationDescriptor 參數時,媒體來源應該只會檢查其正常運作所需的資訊。 特別是,用戶端可以將私用屬性新增至簡報描述元。 其他屬性的存在不應該造成 Start 方法失敗。
呼叫 Start 之後,媒體來源上的每個數據流都必須執行下列其中一項:
- 提供媒體數據以回應 IMFMediaStream::RequestSample 呼叫。
- 傳送 MEStreamTick 事件以指出數據流中的間距。
- 傳送 MEEndOfStream 事件,以指出數據流的結尾。
範例
下列範例會在簡報的 1 秒開始播放。
PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 10000000; // 10^7 = 1 second.
hr = pSource->Start(pPresentationDescriptor, NULL, &var);
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows Vista [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows Server 2008 [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | mfidl.h |
程式庫 | Mfuuid.lib |