メディア ファイル用のカスタム メタデータ プロバイダー
このトピックでは、Microsoft Media Foundation メディア ソースのカスタム シェル プロパティ ハンドラーを記述する方法について説明します。
Note
Media Foundation のメタデータ プロバイダーの背景情報については、「 Media Metadata」を参照してください。 このトピックでは、Shell プロパティ ハンドラーについて説明します。バージョン 1 のメタデータ インターフェイス IMFMetadata は記述しません。
メタデータは、ファイルの形式に密接に関連付けられています。 Media Foundation では、ファイル形式はメディア ソースによって表されます。 Media Foundation でネイティブにサポートされていない形式のメタデータをサポートする場合は、プロパティ ハンドラーを使用してカスタム メディア ソースを実装する必要があります。 プロパティ ハンドラーを使用すると、Shell プロパティ システムはメタデータの読み取りと書き込みを効率的に行うことができます。
プロパティ ハンドラーは、次のインターフェイスを実装する COM オブジェクトです。
必要に応じて、次のインターフェイスを公開することもできます。
Shell プロパティ システムがファイルのメタデータを取得する必要がある場合は、 CoCreateInstance を呼び出してプロパティ ハンドラーを作成し、 IPropertyStore インターフェイスで適切な読み取りおよび書き込みメソッドを呼び出します。
Media Foundation パイプラインでは、メディア ソースから直接プロパティ ハンドラーを取得するため、少し異なるメカニズムが使用されます。 CoCreateInstance を呼び出してプロパティ ハンドラーを作成する代わりに、パイプラインはメディア ソースで IMFGetService::GetService を呼び出します(シェル メタデータ プロバイダーのトピックで説明します)。
カスタム プロパティ ハンドラーを作成するには、次の操作を行います。
- IPropertyStore を公開する IMFGetService インターフェイスを実装します。 サービス 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 レジストリ設定を設定します。
関連トピック