Metadatenanbieter in Windows Vista
In Windows Vista macht Microsoft Media Foundation Metadaten über die IMFMetadata-Schnittstelle verfügbar.
Lesen von Metadaten
Führen Sie die folgenden Schritte aus, um Metadaten aus einer Medienquelle zu lesen:
- Rufen Sie einen Zeiger auf die IMFMediaSource-Schnittstelle der Medienquelle ab. Sie können die IMFSourceResolver-Schnittstelle verwenden, um einen IMFMediaSource-Zeiger abzurufen.
- Rufen Sie IMFMediaSource::CreatePresentationDescriptor auf, um den Präsentationsdeskriptor der Medienquelle abzurufen.
- Rufen Sie MFGetService für die Medienquelle auf, um einen Zeiger auf die IMFMetadataProvider-Schnittstelle zu erhalten. Geben Sie im parameter guidService von MFGetService den Wert MF_METADATA_PROVIDER_SERVICE an. Wenn die Quelle die IMFMetadataProvider-Schnittstelle nicht unterstützt, gibt MFGetServiceMF_E_UNSUPPORTED_SERVICE zurück.
- Rufen Sie IMFMetadataProvider::GetMFMetadata auf, und übergeben Sie einen Zeiger auf den Präsentationsdeskriptor. Diese Methode gibt einen Zeiger auf die IMFMetadata-Schnittstelle zurück.
- Um Metadaten auf Streamebene abzurufen, rufen Sie zunächst IMFStreamDescriptor::GetStreamIdentifier auf, um den Streambezeichner abzurufen. Übergeben Sie dann den Streambezeichner im dwStreamIdentifier-Parameter von GetMFMetadata.
- Legen Sie dwStreamIdentifier auf Null fest, um Metadaten auf Präsentationsebene abzurufen.
- [Optional] Rufen Sie IMFMetadata::GetAllLanguages auf, um eine Liste der Sprachen zu erhalten, in denen Metadaten verfügbar sind. Sprachen werden mithilfe von RFC 1766-kompatiblen Sprachtags identifiziert.
- [Optional] Rufen Sie IMFMetadata::SetLanguage auf, um die Sprache auszuwählen.
- [Optional] Rufen Sie IMFMetadata::GetAllPropertyNames auf, um eine Liste der Namen aller Metadateneigenschaften für diesen Stream oder diese Präsentation abzurufen.
- Rufen Sie IMFMetadata::GetProperty auf, um einen bestimmten Metadateneigenschaftswert abzurufen, und übergeben Sie dabei den Namen der Eigenschaft.
Der folgende Code zeigt die Schritte 2 bis 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;
}
Der folgende Code zeigt die Schritte 7 bis 8. Angenommen, es DisplayProperty
handelt sich um eine Funktion, die einen PROPVARIANT-Wert anzeigt.
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;
}
Zugehörige Themen