Windows Vista 中的中繼資料提供者

在 Windows Vista 中,Microsoft Media Foundation 會透過 IMFMetadata 介面公開中繼資料。

讀取中繼資料

若要從媒體來源讀取中繼資料,請執行下列步驟:

  1. 取得媒體來源之 IMFMediaSource 介面的指標。 您可以使用 IMFSourceResolver 介面來取得 IMFMediaSource 指標。
  2. 呼叫 IMFMediaSource::CreatePresentationDescriptor 以取得媒體來源的簡報描述元。
  3. 在媒體來源上呼叫 MFGetService ,以取得 IMFMetadataProvider 介面的指標。 在MFGetServiceguidService參數中,指定值MF_METADATA_PROVIDER_SERVICE。 如果來源不支援 IMFMetadataProvider 介面, MFGetService 會傳回 MF_E_UNSUPPORTED_SERVICE
  4. 呼叫 IMFMetadataProvider::GetMFMetadata ,並傳入簡報描述元的指標。 這個方法會傳回 IMFMetadata 介面的指標。
    • 若要取得資料流程層級中繼資料,請先呼叫 IMFStreamDescriptor::GetStreamIdentifier 以取得資料流程識別碼。 然後在GetMFMetadatadwStreamIdentifier參數中傳遞資料流程識別碼。
    • 若要取得簡報層級中繼資料,請將 dwStreamIdentifier 設定為零。
  5. [選擇性]呼叫 IMFMetadata::GetAllLanguages 以取得可用的中繼資料語言清單。 語言是使用 RFC 1766 相容的語言標記來識別。
  6. [選擇性]呼叫 IMFMetadata::SetLanguage 以選取語言。
  7. [選擇性]呼叫 IMFMetadata::GetAllPropertyNames 以取得此資料流程或簡報之所有中繼資料屬性的名稱清單。
  8. 呼叫 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;
}

媒體中繼資料

Shell 中繼資料提供者