共用方式為


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 元數據提供者