次の方法で共有


メディア ファイル用のカスタム メタデータ プロバイダー

このトピックでは、Microsoft Media Foundation メディア ソースのカスタム シェル プロパティ ハンドラーを記述する方法について説明します。

手記

Media Foundation のメタデータ プロバイダーの背景情報については、「Media Metadata」を参照してください。 このトピックでは、シェル プロパティ ハンドラーについて説明します。これは、IMFMetadataバージョン 1 のメタデータ インターフェイスを記述していません。

 

メタデータは、ファイルの形式に密接に関連付けられています。 Media Foundation では、ファイル形式はメディア ソースによって表されます。 Media Foundation でネイティブにサポートされていない形式のメタデータをサポートする場合は、プロパティ ハンドラーを使用してカスタム メディア ソースを実装する必要があります。 プロパティ ハンドラーを使用すると、Shell プロパティ システムでメタデータの読み取りと書き込みを効率的に行うことができます。

プロパティ ハンドラーは、次のインターフェイスを実装する COM オブジェクトです。

  • IInitializeWithStream
  • IPropertyStore

必要に応じて、次のインターフェイスを公開することもできます。

シェル プロパティ システムがファイルのメタデータを取得する必要がある場合は、CoCreateInstance呼び出してプロパティ ハンドラーを作成し、IPropertyStore インターフェイスで適切な読み取りおよび書き込みメソッドを呼び出します。

Media Foundation パイプラインでは、メディア ソースから直接プロパティ ハンドラーを取得するため、少し異なるメカニズムが使用されます。 プロパティ ハンドラー 作成するために CoCreateInstance を呼び出す代わりに、パイプラインはメディア ソース IMFGetService::GetService を呼び出します。詳細については、「シェル メタデータ プロバイダー 」を参照してください。

カスタム プロパティ ハンドラーを作成するには、次の操作を行います。

  • IMFGetService インターフェイスを実装して、IPropertyStore公開します。 サービス GUID が MF_PROPERTY_HANDLER_SERVICE
  • メディア ソースをリモートで使用する場合は、IMFGetServiceに加えて、メディア ソースの QueryInterface メソッドを介して、IPropertyStore インターフェイスも公開する必要があります。
  • プロパティ ハンドラーをシェル プロパティ システムで使用できるようにするには、「プロパティ ハンドラーの登録と配布の 」の説明に従って、プロパティ ハンドラーの DLL を登録します。
  • メディア ソースは、スキーム ハンドラーと Byte-Stream ハンドラーで説明されているように、個別に登録されます。

実装のヒント

メタデータ プロパティ キーの一覧については、「Media Files のメタデータ プロパティ」を参照してください。

プロパティ ハンドラーは高速である必要があります。メタデータへの効率的な読み取りと書き込みアクセスを提供する必要があります。 (シェルが何百ものファイルからメタデータを取得する可能性があることを考慮してください)。したがって、プロパティ ハンドラーから MFStartup呼び出さないでください。 MFStartup 関数は、複数のワーク キュー スレッドを作成し、グローバル メモリを割り当てるので、スタートアップ待機時間が発生します。

一般的な実装では、プロパティ ハンドラーとメディア ソースは、同じ解析コードの一部を共有します。 ただし、メディア ソースは I/O の非同期 IMFByteStream 呼び出しを使用しますが、プロパティ ハンドラーは IStream インターフェイスを使用します。 Media Foundation には、IStreamベースのストリームをラップし、それを IMFByteStream ストリームとして公開するヘルパー オブジェクトが用意されています。 ラッパーを作成するには、MFCreateMFByteStreamOnStream呼び出します。

メタデータを更新するときは、データを元のストリームに直接書き込むすることをお勧めします。 この推奨事項は、データのコピーが変更されるほとんどのプロパティ ハンドラーの の書き込み時のコピー 動作とは異なります。 メディア ファイルは非常に大きくなる可能性があるため、通常、書き込み時のコピーは、効率的な実装には遅すぎます。 書き込み時のコピーを無効にするには、「プロパティ ハンドラーの登録と配布 に関する説明に従って、ManualSafeSave レジストリ設定を設定します。

メディア メタデータ

メディア ソース

カスタム メディア ソース を書き込む