媒體檔案的自訂中繼資料提供者
本主題描述如何撰寫 Microsoft Media Foundation 媒體來源的自訂 Shell 屬性處理常式。
注意
如需媒體基礎中中繼資料提供者的背景資訊,請參閱 媒體中繼資料。 本主題討論 Shell 屬性處理常式;它不會描述第 1 版中繼資料介面 IMFMetadata。
中繼資料會緊密系結至檔案的格式。 在媒體基礎中,檔案格式是由媒體來源表示。 如果您想要支援媒體基礎中原生不支援之格式的中繼資料,您必須使用屬性處理常式來實作自訂媒體來源。 屬性處理常式可讓 Shell 屬性系統有效率地讀取和寫入中繼資料。
屬性處理常式是實作下列介面的 COM 物件:
您也可以選擇性地公開下列介面:
如果 Shell 屬性系統需要取得檔案的中繼資料,它會呼叫 CoCreateInstance 來建立屬性處理常式,然後在 IPropertyStore 介面上呼叫適當的讀取和寫入方法。
Media Foundation 管線會使用稍微不同的機制,因為管線會直接從媒體來源取得屬性處理常式。 管線不會呼叫 CoCreateInstance 來建立屬性處理常式,而是在媒體來源上呼叫 IMFGetService::GetService ,如 Shell 中繼資料提供者主題中所述。
若要建立自訂屬性處理常式,請執行下列動作:
- 實作 IMFGetService 介面來公開 IPropertyStore。 服務 GUID 會MF_PROPERTY_HANDLER_SERVICE。
- 如果媒體來源會從遠端使用,除了IMFGetService之外,還必須透過媒體來源的QueryInterface方法公開IPropertyStore介面。
- 若要讓屬性處理常式可供 Shell 屬性系統使用,請登錄屬性處理常式的 DLL,如 註冊和散發屬性處理常式中所述。
- 媒體來源會個別註冊,如 配置處理常式和Byte-Stream處理常式中所述。
實作秘訣
如需中繼資料屬性索引鍵的清單,請參閱 媒體檔案的中繼資料屬性。
屬性處理常式必須快速;它們必須提供有效率的中繼資料讀取和寫入存取權。 (請考慮殼層可能會從數百個檔案擷取中繼資料。) 因此,請勿從您的屬性處理常式呼叫 MFStartup 。 MFStartup函式引進啟動延遲,因為它會建立多個工作佇列執行緒並配置全域記憶體。
在一般實作中,屬性處理常式和媒體來源會共用一些相同的剖析程式碼。 不過,媒體來源會針對 I/O 使用非同步 IMFByteStream 呼叫,而屬性處理常式則使用 IStream 介面。 媒體基礎提供協助程式物件,以包裝 以 IStream為基礎的資料流程,並將其公開為 IMFByteStream 資料流程 。 若要建立包裝函式,請呼叫 MFCreateMFByteStreamOnStream。
更新中繼資料時,建議將資料直接寫入原始資料流程。 這項建議與大部分屬性處理常式的 複製寫入 行為不同,其中會修改資料的複本。 媒體檔案可能非常大,因此寫入時複製通常太慢,無法有效率的實作。 若要停用寫入時複製,請設定 ManualSafeSave 登錄設定,如 註冊和散發屬性處理常式中所述。
相關主題