다음을 통해 공유


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단계를 보여줍니다. 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;
}

미디어 메타데이터

셸 메타데이터 공급자