Windows Vista のメタデータ プロバイダー
Windows Vista では、Microsoft Media Foundation は IMFMetadata インターフェイスを介してメタデータを公開します。
メタデータの読み取り
メディア ソースからメタデータを読み取る場合は、次の手順を実行します。
- メディア ソースの IMFMediaSource インターフェイスへのポインターを取得します。 IMFSourceResolver インターフェイスを使用して、IMFMediaSource ポインターを取得できます。
- IMFMediaSource::CreatePresentationDescriptor を呼び出して、メディア ソースのプレゼンテーション記述子を取得します。
- メディア ソースで MFGetService を呼び出して、 IMFMetadataProvider インターフェイスへのポインターを取得します。 MFGetService の guidService パラメーターで、MF_METADATA_PROVIDER_SERVICE値を指定します。 ソースが IMFMetadataProvider インターフェイスをサポートしていない場合、 MFGetService は MF_E_UNSUPPORTED_SERVICEを返します。
-
IMFMetadataProvider::GetMFMetadata を呼び出し、プレゼンテーション記述子へのポインターを渡します。 このメソッドは、 IMFMetadata インターフェイスへのポインターを返します。
- ストリーム レベルのメタデータを取得するには、まず IMFStreamDescriptor::GetStreamIdentifier を 呼び出してストリーム識別子を取得します。 次に、GetMFMetadata の dwStreamIdentifier パラメーターにストリーム識別子を渡します。
- プレゼンテーション レベルのメタデータを取得するには、 dwStreamIdentifier を 0 に設定します。
- [省略可能] IMFMetadata::GetAllLanguages を呼び出して、メタデータが使用可能な言語の一覧を取得します。 言語は、RFC 1766 準拠の言語タグを使用して識別されます。
- [省略可能] IMFMetadata::SetLanguage を呼び出して言語を選択します。
- [省略可能] IMFMetadata::GetAllPropertyNames を呼び出して、このストリームまたはプレゼンテーションのすべてのメタデータ プロパティの名前の一覧を取得します。
- IMFMetadata::GetProperty を呼び出して、特定のメタデータ プロパティ値を取得し、プロパティの名前を渡します。
次のコードは、手順 2 から 4 を示しています。
HRESULT GetMetadata(
IMFMediaSource *pSource, IMFMetadata **ppMetadata, DWORD dwStream = 0)
{
IMFPresentationDescriptor *pPD = NULL;
IMFMetadataProvider *pProvider = NULL;
HRESULT hr = pSource->CreatePresentationDescriptor(&pPD);
if (FAILED(hr))
{
goto done;
}
hr = MFGetService(
pSource, MF_METADATA_PROVIDER_SERVICE, IID_PPV_ARGS(&pProvider));
if (FAILED(hr))
{
goto done;
}
hr = pProvider->GetMFMetadata(pPD, dwStream, 0, ppMetadata);
done:
SafeRelease(&pPD);
SafeRelease(&pProvider);
return hr;
}
次のコードは、手順 7 から 8 を示しています。 が DisplayProperty
PROPVARIANT 値を表示する関数であるとします。
HRESULT DisplayMetadata(IMFMetadata *pMetadata)
{
PROPVARIANT varNames;
HRESULT hr = pMetadata->GetAllPropertyNames(&varNames);
if (FAILED(hr))
{
return hr;
}
for (ULONG i = 0; i < varNames.calpwstr.cElems; i++)
{
wprintf(L"%s\n", varNames.calpwstr.pElems[i]);
PROPVARIANT varValue;
hr = pMetadata->GetProperty( varNames.calpwstr.pElems[i], &varValue );
if (SUCCEEDED(hr))
{
DisplayProperty(varValue);
PropVariantClear(&varValue);
}
}
PropVariantClear(&varNames);
return hr;
}
関連トピック