Proveedores de metadatos en Windows Vista
En Windows Vista, Microsoft Media Foundation expone metadatos a través de la interfaz IMFMetadata .
Lectura de metadatos
Para leer metadatos de un origen multimedia, realice los pasos siguientes:
- Obtenga un puntero a la interfaz IMFMediaSource del origen multimedia. Puede usar la interfaz IMFSourceResolver para obtener un puntero IMFMediaSource .
- Llame a IMFMediaSource::CreatePresentationDescriptor para obtener el descriptor de presentación del origen multimedia.
- Llame a MFGetService en el origen multimedia para obtener un puntero a la interfaz IMFMetadataProvider . En el parámetro guidService de MFGetService, especifique el valor MF_METADATA_PROVIDER_SERVICE. Si el origen no admite la interfaz IMFMetadataProvider , MFGetService devuelve MF_E_UNSUPPORTED_SERVICE.
- Llame a IMFMetadataProvider::GetMFMetadata y pase un puntero al descriptor de presentación. Este método devuelve un puntero a la interfaz IMFMetadata .
- Para obtener los metadatos de nivel de secuencia, llame primero a IMFStreamDescriptor::GetStreamIdentifier para obtener el identificador de secuencia. A continuación, pase el identificador de secuencia en el parámetro dwStreamIdentifier de GetMFMetadata.
- Para obtener metadatos de nivel de presentación, establezca dwStreamIdentifier en cero.
- [Opcional] Llame a IMFMetadata::GetAllLanguages para obtener una lista de los idiomas en los que están disponibles los metadatos. Los idiomas se identifican mediante etiquetas de idioma compatibles con RFC 1766.
- [Opcional] Llame a IMFMetadata::SetLanguage para seleccionar el idioma.
- [Opcional] Llame a IMFMetadata::GetAllPropertyNames para obtener una lista de los nombres de todas las propiedades de metadatos de esta secuencia o presentación.
- Llame a IMFMetadata::GetProperty para obtener un valor de propiedad de metadatos específico, pasando el nombre de la propiedad.
En el código siguiente se muestran los pasos del 2 al 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;
}
En el código siguiente se muestran los pasos 7 a 8. Supongamos que DisplayProperty
es una función que muestra un valor 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;
}
Temas relacionados