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_I8VT_EMPTY。 使用 VT_I8 以 100 奈秒單位指定新的起始位置。 使用 VT_EMPTY 從目前位置開始。 其他時間格式可能會使用其他 PROPVARIANT 類型。

傳回值

方法會傳回 HRESULT。 可能的值包括 (但不限於) 下表中的這些值。

傳回碼 描述
S_OK
此方法已成功。
MF_E_ASF_OUTOFRANGE
開始位置超過簡報結尾, (ASF 媒體來源) 。
MF_E_HW_MFT_FAILED_START_STREAMING
硬體裝置無法啟動串流處理。 這個錯誤碼可由代表硬體裝置的媒體來源傳回,例如相機。 例如,如果相機已經由另一個應用程式使用,此方法可能會傳回這個錯誤碼。
MF_E_INVALIDREQUEST
啟動要求無效。 例如,開始位置超過簡報的結尾。
MF_E_SHUTDOWN
已呼叫媒體來源的 Shutdown 方法。
MF_E_UNSUPPORTED_TIME_FORMAT
媒體來源不支援 pguidTimeFormat 中指定的時間格式。

備註

這個方法是非同步方法。 如果作業成功,媒體來源會傳送下列事件:

  • 針對每個新的數據流,來源會傳送 MENewStream 事件。 此事件會針對數據流出現的第一個 開始 呼叫傳送。 事件數據是數據流 之IMFMediaStream 介面的指標。
  • 針對每個 更新 的數據流,來源會傳送 MEUpdatedStream 事件。 例如,如果應用程式在播放期間搜尋) ,則當呼叫 Start 時已有數據流 (,就會更新數據流。 事件數據是數據流 之IMFMediaStream 介面的指標。
  • 如果先前的狀態已停止,來源會傳送 MESourceStarted 事件。
  • 如果先前的狀態已啟動或暫停,而起始位置是目前的位置 (VT_EMPTY) ,來源就會傳送 MESourceStarted 事件。
  • 如果先前的狀態已啟動或暫停,而且指定了新的起始位置,來源就會傳送 MESourceSeeked 事件。
  • 如果來源傳送 MESourceStarted 事件,則每個媒體數據流都會傳送 MEStreamStarted 事件。 如果來源傳送 MESourceSeeked 事件,則每個數據流都會傳送 MEStreamSeeked 事件。
如果方法傳回 S_OK) 之後異步 (啟動作業失敗,媒體來源會傳送包含失敗碼的 MESourceStarted 事件,而不會傳送此處所列的任何其他事件。 如果方法以同步方式失敗, (傳回錯誤碼) ,則不會引發任何事件。

如果先前的狀態已啟動或暫停,且新的起始位置未VT_EMPTY,則呼叫 Start 會導致搜尋。 並非所有媒體來源都可以搜尋。 如果媒體來源可以搜尋, IMFMediaSource::GetCharacteristics 方法會傳回 MFMEDIASOURCE_CAN_SEEK 旗標。

來自媒體來源的事件不會與來自媒體數據流的事件同步處理。 因此,如果您搜尋媒體來源,在取得 MESourceSeeked 事件之後,仍然可以從先前的位置接收樣本。 如果您需要同步處理作業,請等候串流事件 MEStreamSeeked,這會標示搜尋發生所在數據流中的確切點。

結束 Stream

當數據流播放至結尾時,數據流會傳送 MEEndOfStream 事件。 當所有選取的數據流都到達結尾時,媒體來源會傳送 MEEndOfPresentation 事件。

如果開始位置超過選取數據流結尾 (,但在簡報結尾) 之前,數據流應該會在MEStreamStarted/MEStreamSeeked之後立即傳送MEEndOfStream。 如果播放到達簡報的結尾,而且從目前的位置再次呼叫 Start ,數據流會重新傳送 MEEndOfStream 事件,而媒體來源會重新傳送 MEEndOfPresentation 事件。 這些事件會通知管線不要要求更多數據。

在反向播放期間,檔案的開頭會被視為數據流的結尾。 如需詳細資訊,請參閱 實作速率控制

實作開始

當媒體來源執行搜尋時,它應該從搜尋時間之前的第一個主要畫面格開始,讓譯碼器可以譯碼目標開始時間的範例。 管線會捨棄任何太早譯碼的樣本。

如果開始時間 VT_EMPTY 且先前的狀態已啟動或暫停,來源應該會從目前的位置繼續。 在此情況下,不需要重新傳送上一個主要畫面格,因為譯碼器仍然會有先前傳送的數據。

驗證 pPresentationDescriptor 參數時,媒體來源應該只會檢查其正常運作所需的資訊。 特別是,用戶端可以將私用屬性新增至簡報描述元。 其他屬性的存在不應該造成 Start 方法失敗。

呼叫 Start 之後,媒體來源上的每個數據流都必須執行下列其中一項:

如需詳細資訊,請參閱 撰寫自定義媒體來源

範例

下列範例會在簡報的 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

另請參閱

IMFMediaSource

媒體來源