Share via


Provider di metadati in Windows Vista

In Windows Vista, Microsoft Media Foundation espone i metadati tramite l'interfaccia IMFMetadata .

Lettura dei metadati

Per leggere i metadati da un'origine multimediale, seguire questa procedura:

  1. Ottenere un puntatore all'interfaccia IMFMediaSource dell'origine multimediale. È possibile usare l'interfaccia IMFSourceResolver per ottenere un puntatore IMFMediaSource .
  2. Chiamare IMFMediaSource::CreatePresentationDescriptor per ottenere il descrittore di presentazione dell'origine multimediale.
  3. Chiamare MFGetService nell'origine multimediale per ottenere un puntatore all'interfaccia IMFMetadataProvider . Nel parametro guidService di MFGetService specificare il valore MF_METADATA_PROVIDER_SERVICE. Se l'origine non supporta l'interfaccia IMFMetadataProvider , MFGetService restituisce MF_E_UNSUPPORTED_SERVICE.
  4. Chiamare IMFMetadataProvider::GetMFMetadata e passare un puntatore al descrittore di presentazione. Questo metodo restituisce un puntatore all'interfaccia IMFMetadata .
    • Per ottenere i metadati a livello di flusso chiama prima IMFStreamDescriptor::GetStreamIdentifier per ottenere l'identificatore del flusso. Passare quindi l'identificatore del flusso nel parametro dwStreamIdentifier di GetMFMetadata.
    • Per ottenere i metadati a livello di presentazione, impostare dwStreamIdentifier su zero.
  5. [Facoltativo] Chiama IMFMetadata::GetAllLanguages per ottenere un elenco delle lingue in cui sono disponibili i metadati. Le lingue vengono identificate usando tag di linguaggio conformi a RFC 1766.
  6. [Facoltativo] Chiamare IMFMetadata::SetLanguage per selezionare la lingua.
  7. [Facoltativo] Chiamare IMFMetadata::GetAllPropertyNames per ottenere un elenco dei nomi di tutte le proprietà dei metadati per questo flusso o presentazione.
  8. Chiamare IMFMetadata::GetProperty per ottenere un valore di proprietà di metadati specifico, passando il nome della proprietà.

Il codice seguente illustra i passaggi da 2 a 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;
}

Il codice seguente illustra i passaggi da 7 a 8. Si supponga che DisplayProperty sia una funzione che visualizza un valore 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;
}

Metadati multimediali

Provider di metadati della shell