Bagikan melalui


Penyedia Metadata di Windows Vista

Di Windows Vista, Microsoft Media Foundation mengekspos metadata melalui antarmuka IMFMetadata .

Membaca Metadata

Untuk membaca metadata dari sumber media, lakukan langkah-langkah berikut:

  1. Dapatkan penunjuk ke antarmuka IMFMediaSource dari sumber media. Anda dapat menggunakan antarmuka IMFSourceResolver untuk mendapatkan penunjuk IMFMediaSource .
  2. Panggil IMFMediaSource::CreatePresentationDescriptor untuk mendapatkan deskriptor presentasi sumber media.
  3. Panggil MFGetService di sumber media untuk mendapatkan penunjuk ke antarmuka IMFMetadataProvider . Dalam parameter guidServiceMFGetService, tentukan nilai MF_METADATA_PROVIDER_SERVICE. Jika sumber tidak mendukung antarmuka IMFMetadataProvider , MFGetService mengembalikan MF_E_UNSUPPORTED_SERVICE.
  4. Panggil IMFMetadataProvider::GetMFMetadata dan teruskan penunjuk ke deskriptor presentasi. Metode ini mengembalikan penunjuk ke antarmuka IMFMetadata .
    • Untuk mendapatkan metadata tingkat aliran, pertama-tama panggil IMFStreamDescriptor::GetStreamIdentifier untuk mendapatkan pengidentifikasi aliran. Kemudian berikan pengidentifikasi aliran di parameter dwStreamIdentifiergetMFMetadata.
    • Untuk mendapatkan metadata tingkat presentasi, atur dwStreamIdentifier ke nol.
  5. [Opsional] Panggil IMFMetadata::GetAllLanguages untuk mendapatkan daftar bahasa tempat metadata tersedia. Bahasa diidentifikasi menggunakan tag bahasa yang mematuhi RFC 1766.
  6. [Opsional] Panggil IMFMetadata::SetLanguage untuk memilih bahasa.
  7. [Opsional] Panggil IMFMetadata::GetAllPropertyNames untuk mendapatkan daftar nama semua properti metadata untuk aliran atau presentasi ini.
  8. Panggil IMFMetadata::GetProperty untuk mendapatkan nilai properti metadata tertentu, meneruskan nama properti .

Kode berikut menunjukkan langkah 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;
}

Kode berikut menunjukkan langkah 7–8. Asumsikan bahwa DisplayProperty adalah fungsi yang menampilkan nilai 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;
}

Media Metadata

Penyedia Metadata Shell