ASF 媒體來源

媒體基礎提供 ASF 媒體來源,應用程式可用來在架構的管線層中代表 ASF 檔案。

為了播放 ASF 檔案,應用程式可以使用 ASF 媒體來源將資料摘要至播放管線。 在編碼案例中,應用程式可以使用 ASF 媒體來源做為來源來轉換成另一種格式,或將較高的位元速率檔案轉換成較低的位元速率檔案,而不需要變更格式。 ASF 媒體來源必須用於管線層,也就是應用程式必須使用媒體會話來控制作業。 這種存取層級可讓應用程式在媒體會話進行時取得事件。 若要取得 ASF 內容的較低層級存取權,應用程式必須使用 WMContainer 層 ASF 元件。

ASF 媒體來源會實作 IMFMediaSource 介面,這是媒體基礎中媒體來源的一般介面。 如同任何其他媒體來源,ASF 媒體來源提供主要描述 ASF 標頭物件的簡報描述元。 此外,ASF 媒體來源會提供資料流程描述元,代表媒體內容中的每個資料流程。 如需詳細資訊,請參閱 ASF 檔案結構

建立 ASF 媒體來源

若要建立 ASF 媒體來源,應用程式必須使用 來源解析程式。 若要建立 ASF 媒體來源,應用程式必須提供來源解析程式建立 ASF 媒體來源的來源。 來源資訊必須藉由指定來源檔案的 URL 或包含媒體的位元組資料流程來提供。 如果應用程式藉由指定 URL 來選擇建立 ASF 媒體來源,則必須呼叫 IMFSourceResolver::CreateObjectFromURL 進行同步作業或 IMFSourceResolver::Begin...EndCreateObjectFromURL 以進行非同步作業。 從位元組資料流程建立媒體來源的程式很類似。 應用程式必須呼叫 IMFSourceResolver::CreateObjectFromByteStream 進行同步作業或 IMFSourceResolver::Begin...EndCreateObjectFromBytestream 以進行非同步作業。 這些呼叫必須在 dwFlags 參數中指定MF_RESOLUTION_MEDIASOURCE。 如需使用此旗標的詳細資訊,請參閱使用來源解析程式。

如果應用程式指定本機檔案的 URL,則 URL 字串可以包含媒體檔案的路徑,或前置詞為 「file: 」scheme。 副檔名必須是 「.asf」、「.wm」、「L」.wma「或 」.wmv」。 針對網路上的 ASF 檔案,來源解析程式會建立 網路來源,其會使用 ASF 媒體來源。

在物件建立程式期間,來源解析程式會查閱系統登錄中的配置處理常式和位元組資料流程處理常式清單,並載入最接近的相符處理常式,以剖析媒體內容,同時在下方建立媒體來源物件。 不論用來建立媒體來源的方法 (URL 和位元組資料流程) ,來源解析程式會建立位元組資料流程,並將來源媒體的內容讀入位元組資料流程。 如需詳細資訊,請參閱 配置處理常式和Byte-Stream處理常式

如需如何建立媒體來源的程式碼範例,請參閱 使用來源解析程式

ASF 媒體來源的組態設定

來源解析程式會查詢基礎位元組資料流程的功能,並判斷新建立的媒體來源上允許作業。 其中一項功能正在搜尋。 如果允許搜尋作業,應用程式可以指定媒體來源在搜尋簡報中特定點時所使用的搜尋模式。

應用程式可以在物件建立期間設定媒體來源使用的搜尋模式。 使用指定的搜尋模式建立 ASF 媒體來源之後,就無法在媒體來源上修改,或在簡報期間動態變更。 搜尋喜好設定會指定為應用程式呼叫中用來建立媒體來源的相關來源解析程式方法的屬性。 這些屬性集是在屬性存放區中設定,並傳遞至 pProps 參數。 如果未傳遞這些屬性,媒體來源會以預設設定運作。 如需設定這些屬性的詳細資訊,請參閱 設定媒體來源

如果允許搜尋,ASF 媒體來源支援下列搜尋模式:

  • 確切搜尋:在此模式中,ASF 媒體來源依賴 ASF 檔案的 ASF 索引物件。 如果檔案沒有 Index 物件,則會停用確切搜尋,而且會根據媒體來源上設定的應用程式指定屬性,使用其他其中一種模式。
  • 近似搜尋:應用程式會藉由將屬性存放區中的 MFPKEY_ASFMediaSource_ApproxSeek 傳遞至相關的來源解析程式方法,要求此模式。 不過,只有在位元組資料流程不支援以時間為基礎的搜尋時,才會使用近似搜尋。 在此模式中,媒體來源會決定相對接近搜尋時間的開始時間。 如果 ASF 檔案包含 ASF 索引物件,則會用來計算開始時間。 近似搜尋較不精確,但比確切搜尋更快,因為在預先決定的開始時間轉譯第一個樣本所花費的時間較快。
  • 反復搜尋:若要設定此模式,應用程式必須設定 MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex 屬性。 反復搜尋是一種演算法,可尋找不含 ASF 索引物件的 ASF 檔案中的位置。 在此模式中,媒體來源會藉由讀取位元組資料流程位移來判斷搜尋點的粗略估計值。 它會根據平均位元速率使用一系列近似值,以逐漸接近目標搜尋時間。 (演算法類似于二進位搜尋。) 反復搜尋可能需要比使用索引物件搜尋更長的時間,因此預設會停用。 如果您設定此屬性,請使用下列屬性來設定搜尋參數:MFPKEY_ASFMediaSource_IterativeSeek_Max_CountMFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond。 這些屬性分別設定反復專案數目上限和容錯。 當演算法達到反覆運算數目上限,或找到與搜尋時間距離在指定容錯範圍內的封包時,演算法就會停止。

簡單地說,當 ASF 檔案不包含 ASF 索引物件時,應用程式可以選擇近似或反復搜尋。

ASF 媒體來源物件模型

ASF 媒體來源會實作 IMFMediaSource 介面,並公開下列介面。 應用程式可以在 ASF 媒體來源上呼叫 IMFMediaSource::QueryInterface ,以取得這些介面的參考。

介面 描述
IMFMediaSource 所有媒體來源都需要。
IMFMediaEventGenerator 所有媒體來源都需要。 允許應用程式透過媒體會話從媒體來源取得事件。
IMFGetService 查詢指定之服務介面的媒體來源。
IPropertyStore 在媒體來源上設定和取得屬性。 每個屬性都包含描述性名稱和值。
IMFMetadata 描述 ASF 檔案的中繼資料。
IMFMetadataProvider 擷取整個簡報的元資料集合,或針對簡報中的一個資料流程擷取。
IMFRateSupport 查詢支援的播放速率範圍,包括反向播放。
IMFRateControl 取得或設定播放速率。
IMFTrustedInput 取得來源中包含的每個 ASF 資料流程的 ITA。
IMFPMPClient 可讓媒體來源接收 IMFPMPHost 介面的指標,此介面可用來在 PMP 程式中建立物件。
IMFTimecodeTranslate 在電影社會與電視工程師之間轉換 (SMPTE) 時間代碼和 100 奈秒的時間單位。

 

ASF 媒體來源服務

ASF 媒體來源提供適用于 ASF 檔案的各種服務。 若要取得特定服務的指標,應用程式必須在對 MFGetService的呼叫中使用下列其中一個服務識別碼。 如需詳細資訊,請參閱 服務介面

服務識別碼 Description
MF_RATE_CONTROL_SERVICE 透過使用此識別碼,應用程式可以取得 IMFRateSupportIMFRateControl 介面的 指標。 藉由使用媒體來源所實作的速率支持對象,應用程式可以檢查基礎 ASF 媒體檔案是否支援特定速率,也會取得最快且最慢的速率。 藉由使用速率控制物件,應用程式可以取得並設定播放速率。 如果應用程式指定播放的特定速率,ASF 媒體來源會先檢查要求的速率是否在速率限制內, (由快速且最慢的速率決定) ,然後設定速率。 這不會檢查是否有變數條件,因為位元速率可能會隨網路頻寬而變更任何時間。 如需詳細資訊, 請參閱速率控制
MF_METADATA_PROVIDER_SERVICE 透過使用此識別碼,應用程式可以取得 ASF 媒體來源 之 IMFMetadataProvider 介面的指標。 此介面可讓您存取 ASF 檔案的相關資訊,特別是 ASF 標頭物件和媒體內容中包含的資料流程。 標頭資訊是透過簡報描述元屬性公開,而資料流程資訊則是透過資料流程描述元屬性來提供。 如需這些屬性的詳細資訊,請參閱 ASF 標頭物件的媒體基礎屬性。 除了透過屬性公開的資訊之外,還存在描述性中繼資料,這些中繼資料會設定為屬性。
MF_PROPERTY_HANDLER_SERVICE 藉由使用此識別碼,應用程式可以取得 ASF 媒體來源 之 IPropertyStore 介面的指標。 屬性存放區包含與 ASF 檔案相關的所有中繼資料。 此識別碼是Windows 7 中的新功能,並取代MF_METADATA_PROVIDER_SERVICE以取得中繼資料屬性。
MFNETSOURCE_STATISTICS_SERVICE 如需詳細資訊,請參閱在 用戶端記錄中擷取網路統計資料。
MF_TIMECODE_SERVICE 藉由使用此識別碼,應用程式可以取得媒體來源 之 IMFTimecodeTranslate 介面的指標。 此實作可用來執行時間程式碼轉譯,例如將 SMPTE 時間程式碼轉換為 100 奈秒單位和返回。

 

Timecode 翻譯

ASF 媒體來源提供時間程式碼轉譯服務,可讓您的應用程式在 100 奈秒單位中,將 SMPTE 時間程式碼轉換成最接近的簡報時間 () 。 相反地,應用程式也可以取得所要求簡報時間的時間程式碼。 服務可透過 ASF 媒體來源實作的 IMFTimecodeTranslate 介面取得。 這個介面指標上的 方法呼叫是非同步,可從主要應用程式執行緒執行,而不會封鎖應用程式的使用者介面。

下列步驟摘要說明時間程式碼轉譯的程式:

  1. 呼叫MFGetService並指定MF_TIMECODE_SERVICE識別碼,以取得 ASF 媒體來源之IMFTimecodeTranslate介面的指標。
  2. 呼叫 IMFTimecodeTranslate::BeginConvertTimecodeToHNSIMFTimecodeTranslate::BeginConvertHNSToTimecode ,並指定要翻譯的時間。 對於BeginConvertTimecodeToHNS,時間程式碼必須指定為具有VT_I8資料類型的PROPVARIANT變數。 BeginConvertHNSToTimecode方法需要以 100 奈秒為單位的時間作為MFTIME類型。
  3. 適當地呼叫 IMFTimecodeTranslate::EndConvertTimecodeToHNSIMFTimecodeTranslate::EndConvertTimecodeToHNS 來完成非同步作業。

在建立媒體來源期間,來源解析程式會為媒體來源讀取 ASF 內容的檔案建立位元組資料流程。 為了讓時間轉換成功,與 ASF 檔案相關聯的位元組資料流程必須具有搜尋功能;否則,應用程式會從 Begin... 呼叫取得MF_E_BYTESTREAM_NOT_SEEKABLE錯誤。 時間轉換的另一個需求是 ASF 媒體來源所代表的 ASF 檔案必須有 ASF 索引物件。 呈現時間和時間代碼會從 ASF 索引物件擷取,以維護 ASF 檔案的所有索引和對應的搜尋點。 針對簡報時間程式碼轉譯,ASF 檔案必須包含簡單索引物件;對於時間程式碼到呈現時間轉譯,ASF 檔案必須具有 Index 物件。 轉換作業依賴基礎 索引子 (WMContainer 元件) 來剖析和讀取與 ASF 檔案相關聯的 Index 物件。 如果檔案不包含 Index 物件,應用程式會以非同步方式接收MF_E_NO_INDEX錯誤碼。

若要轉譯應用程式所要求的時間,媒體來源會列舉檔案內的資料流程,並尋找包含適當 ASF 索引物件的資料流程。 如果找到這類資料流程,媒體來源會剖析資料流程的 ASF 封包,直到到達正確的程式碼為止。 在找到正確的範例之後,它會從範例擷取對應的簡報時間或時間程式碼,並將它傳回給呼叫端。

指令碼命令支援

當您建置包含腳本資料流程的 ASF 拓撲時,腳本資料流程節點會新增至拓撲。 此節點會在適當的時間傳送 IMFSamples。 腳本來源節點所提供的 IMFSample 會將資料儲存在與範例相關聯的 IMFMediaBuffer 中。 您可以在範例上呼叫 CopyToBuffer 以取得 IMFMediaBuffer,然後在緩衝區上呼叫 Lock 以取得資料。

腳本資料流程承載會封裝到緩衝區中做為類型字串,後面接著 Null,後面接著命令字串,後面接著 Null。 字串是 ASF 格式的 Unicode。

例如,承載看起來可能會像下列 (,其中 \0 表示 Null 字元) :

URL\0http://contoso.com\0

Text\0 這是標題\0

管線層 ASF 元件

媒體基礎中的 ASF 支援