Windows Vista의 메타데이터 공급자
Windows Vista에서 Microsoft Media Foundation은 IMFMetadata 인터페이스를 통해 메타데이터를 노출합니다.
메타데이터 읽기
미디어 원본에서 메타데이터를 읽으려면 다음 단계를 수행합니다.
- 미디어 소스의 IMFMediaSource 인터페이스에 대한 포인터를 가져옵니다. IMFSourceResolver 인터페이스를 사용하여 IMFMediaSource 포인터를 가져올 수 있습니다.
- IMFMediaSource::CreatePresentationDescriptor 호출하여 미디어 원본의 프레젠테이션 설명자를 가져옵니다.
- 미디어 소스에서 MFGetService 호출하여 IMFMetadataProvider 인터페이스에 대한 포인터를 가져옵니다. MFGetServiceguidService 매개 변수에서 MF_METADATA_PROVIDER_SERVICE값을 지정합니다. 원본이 IMFMetadataProvider 인터페이스를 지원하지 않으면 MFGetServiceMF_E_UNSUPPORTED_SERVICE반환합니다.
-
IMFMetadataProvider::GetMFMetadata 호출하고 프레젠테이션 설명자에 대한 포인터를 전달합니다. 이 메서드는 IMFMetadata 인터페이스에 대한 포인터를 반환합니다.
- 스트림 수준 메타데이터를 얻으려면 먼저 IMFStreamDescriptor::GetStreamIdentifier 호출하여 스트림 식별자를 가져옵니다. 그런 다음 GetMFMetadatadwStreamIdentifier 매개 변수에 스트림 식별자를 전달합니다.
- 프레젠테이션 수준 메타데이터를 얻으려면 dwStreamIdentifier 0으로 설정합니다.
- [선택 사항] IMFMetadata::GetAllLanguages 호출하여 메타데이터를 사용할 수 있는 언어 목록을 가져옵니다. 언어는 RFC 1766 규격 언어 태그를 사용하여 식별됩니다.
- [선택 사항] IMFMetadata::SetLanguage 호출하여 언어를 선택합니다.
- [선택 사항] IMFMetadata::GetAllPropertyNames 호출하여 이 스트림 또는 프레젠테이션에 대한 모든 메타데이터 속성의 이름 목록을 가져옵니다.
- 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;
}
관련 항목