共用方式為


註冊自訂檔案類型

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

本文說明 Filter Graph 管理員如何找到來源篩選,並指定檔案名。 您可以使用這個機制來註冊自己的自訂檔案類型。 註冊檔案類型之後,每當應用程式呼叫 IGraphBuilder::RenderFileIGraphBuilder::AddSourceFilter時,DirectShow 就會自動載入正確的來源篩選。

概觀

若要從指定檔案名找出來源篩選準則,篩選圖形管理員會嘗試執行下列動作,順序如下:

  1. 如果有的話,請比對通訊協定。
  2. 比對副檔名。
  3. 比對檔案內的位元組模式,稱為 檢查位元組

通訊協定

通訊協定名稱,例如 「ftp」 或 「HTTP」 會在 下註冊

HKEY_CLASSES_ROOT

索引鍵,具有下列結構:

HKEY_CLASSES_ROOT
    <protocol>
        Source Filter = <Source filter CLSID>
        Extensions
            <.ext1> = <Source filter CLSID>
            <.ext2> = <Source filter CLSID>

如果檔案名或 URL 包含冒號 (':') ,篩選圖形管理員會嘗試使用 ':' 之前的部分作為通訊協定名稱。 例如,如果名稱為 「myprot://myfile.ext」,它會搜尋名為 myprot的登錄機碼。 如果此機碼存在且包含名為 「Extensions」 的子機碼,篩選圖形管理員就會在該子機碼內搜尋符合副檔名的專案。 索引鍵的值必須是字串格式的 GUID;例如 ,「 {00000000-0000-0000-0000-000000000000} 」。 如果 Filter Graph 管理員無法比對 Extensions 子機碼中的任何專案,它會尋找名為 Source Filter的子機碼,該子機碼也必須是字串格式的 GUID。

如果 Filter Graph 管理員找到相符的 GUID,它會使用此 GUID 作為來源篩選的 CLSID,並嘗試載入篩選。 如果找不到相符專案,它會使用 [ 檔案來源] (URL) 篩選,將檔案名視為 URL。

此演算法有兩個例外狀況:

  • 若要排除驅動程式字母,不會將單一字元字串視為通訊協定。
  • 如果字串為 「file:」 或 「file://」,則不會將其視為通訊協定。

副檔名

如果檔案名中沒有通訊協定,篩選圖形管理員會在登錄中尋找索引鍵 HKEY_CLASSES_ROOT\Media Type\Extensions\的專案。ext\,其中 。ext 是副檔名。 如果此索引鍵存在, [來源篩選 ] 值會以字串形式包含來源篩選的 CLSID。 或者,索引鍵可以有 Media TypeSubtype的值,以提供主要類型和子類型 GUID。

檢查位元組

某些檔案類型可由檔案中特定位元組位移發生的特定位模式來識別。 Filter Graph Manager 會在登錄中尋找具有下列格式的機碼:

HKEY_CLASSES_ROOT\MediaType\{ 主要類型 }\{ 子類型 }

其中主要類型和子類型是定義位元組資料流程媒體類型的 GUID。 每個索引鍵都包含一或多個子機碼,通常命名為 1、2 等等,以定義檢查位元組;和名為 Source Filter 的子機碼,以字串形式提供來源篩選的 CLSID。 check-byte 子機碼是字串,其中包含一或多個稱為 的四邊形數位:

offsetcbmaskval

若要比對檔案,篩選圖形管理員會讀取 cb 位元組,從位元組數位移開始。 然後,它會針對遮罩中的值執行位 AND。 如果結果等於 val,則檔案與該四邊形相符。 值 mask 和 val 會以十六進位表示。 mask 的空白專案會被視為長度為 cb 的 1 個字串。 位移的負值表示檔案結尾的位移。 若要比對機碼,檔案必須符合任何子機碼中的所有四邊形。

例如,假設登錄在 HKCR\Media Type底下包含下列機碼:

{e436eb83-524f-11ce-9f53-0020af0ba770}
    {7364696D-0000-0010-8000-00AA00389B71}
        0                    "0,4,,52494646,8,4,,524D4944"
        1                    "0,4,,4D546864"
        Source Filter        "{E436EBB5-524F-11CE-9F53-0020AF0BA770}"

第一個索引鍵會對應至主要類型MEDIATYPE_Stream。 與子類型對應的子機碼MEDIATYPE_Midi。 來源篩選子機碼的值是CLSID_AsyncReader檔案來源的 CLSID (非同步) 篩選。

每個專案可以有多個擷取專案;所有專案都必須相符。 在下列範例中,檔案的前 4 個位元組必須0xAB、0xCD、0x12 0x34;和檔案的最後 4 個位元組必須是0xAB、0xAB、0x00、0xAB:

    0, 4, , ABCD1234,  -4, 4, , ABAB00AB 

此外,在單一媒體類型下可以列出多個專案。 任何相符專案都已足夠。 此配置允許一組替代遮罩;例如,可能或可能沒有 RIFF 標頭的 .wav 檔案。

注意

此配置類似于 GetClassFile 函式所使用的配置。

 

載入來源篩選

假設 Filter Graph 管理員找到檔案的相符來源篩選,它會將該篩選新增至圖形、查詢IFileSourceFilter 介面的篩選,以及呼叫 IFileSourceFilter::Load Load方法的引數是從登錄決定的檔案名和媒體類型。

如果 Filter Graph 管理員找不到登錄中的任何專案,它預設會使用非同步檔案來源篩選。 在此情況下,它會將媒體類型設定為 MEDIATYPE_StreamMEDIASUBTYPE_None

Windows 媒體播放機中的自訂檔案類型

Windows 媒體播放機會使用一組額外的登錄專案。 如需詳細資訊,請參閱 Windows 媒體播放機 SDK 中的副檔名登錄設定

撰寫 DirectShow 篩選