次の方法で共有


Windows Vista のメタデータ プロバイダー

Windows Vista では、Microsoft Media Foundation は IMFMetadata インターフェイスを介してメタデータを公開します。

メタデータの読み取り

メディア ソースからメタデータを読み取る場合は、次の手順を実行します。

  1. メディア ソースの IMFMediaSource インターフェイスへのポインターを取得します。 IMFSourceResolver インターフェイスを使用して、IMFMediaSource ポインターを取得できます。
  2. IMFMediaSource::CreatePresentationDescriptor を呼び出して、メディア ソースのプレゼンテーション記述子を取得します。
  3. メディア ソースで MFGetService を呼び出して、 IMFMetadataProvider インターフェイスへのポインターを取得します。 MFGetServiceguidService パラメーターで、MF_METADATA_PROVIDER_SERVICE値を指定します。 ソースが IMFMetadataProvider インターフェイスをサポートしていない場合、 MFGetServiceMF_E_UNSUPPORTED_SERVICEを返します。
  4. IMFMetadataProvider::GetMFMetadata を呼び出し、プレゼンテーション記述子へのポインターを渡します。 このメソッドは、 IMFMetadata インターフェイスへのポインターを返します。
    • ストリーム レベルのメタデータを取得するには、まず IMFStreamDescriptor::GetStreamIdentifier を 呼び出してストリーム識別子を取得します。 次に、GetMFMetadatadwStreamIdentifier パラメーターにストリーム識別子を渡します。
    • プレゼンテーション レベルのメタデータを取得するには、 dwStreamIdentifier を 0 に設定します。
  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 を示しています。 が DisplayPropertyPROPVARIANT 値を表示する関数であるとします。

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;
}

メディア メタデータ

シェル メタデータ プロバイダー