共用方式為


ASF 媒體來源

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

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

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

建立 ASF 媒體來源

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

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

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

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

ASF 媒體來源的組態設定

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

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

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

  • 精確搜尋:在此模式中,ASF 媒體來源依賴 ASF 檔案的 ASF 索引物件。 如果檔案沒有 Index 物件,則會停用確切搜尋,而且會根據媒體來源上設定的應用程式指定屬性,使用其他其中一種模式。
  • 近似搜尋:應用程式會藉由將屬性存放區中的MFPKEY_ASFMediaSource_ApproxSeek傳遞至相關的來源解析程式方法,以要求此模式。 不過,只有在位元組數據流不支援以時間為基礎的搜尋時,才會使用近似搜尋。 在此模式中,媒體來源會決定較接近搜尋時間的開始時間。 如果 ASF 檔案包含 ASF 索引物件,則會用來計算開始時間。 近似搜尋較不精確,但比精確搜尋更快,因為在預先決定的開始時間轉譯第一個樣本所花費的時間較快。
  • 反覆搜尋:若要設定此模式,應用程式必須設定 MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex 屬性。 反覆搜尋是一種演算法,用來尋找不含 ASF 索引物件的 ASF 檔案中的位置。 在此模式中,媒體來源會藉由讀取位元組數據流位移來判斷搜尋點的粗略估計。 它會使用一系列的近似值,根據平均比特率,逐漸接近目標搜尋時間。 (演算法類似於二進位搜尋。反覆搜尋所需的時間比使用 Index 物件更久,因此預設會停用。 如果您設定此屬性,請使用下列屬性來設定搜尋參數: 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 的呼叫中使用下列其中一個服務標識符。 如需詳細資訊,請參閱 服務介面

服務標識碼 描述
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 媒體來源提供時間程式代碼翻譯服務,可讓您的應用程式將 SMPTE 時間程式代碼轉換成最接近的簡報時間(以 100 奈秒為單位)。 相反地,應用程式也可以取得所要求簡報時間的時間碼。 此服務可透過 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 檔案必須包含 Simple Index 物件;對於時間程式代碼到簡報時間轉譯,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 支援