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 设置为零。
- [可选]调用 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;
}
相关主题