프레젠테이션 설명자

프레젠테이션은 일반적인 프레젠테이션 시간을 공유하는 관련 미디어 스트림 집합입니다. 예를 들어 프레젠테이션은 영화의 오디오 및 비디오 스트림으로 구성될 수 있습니다. 프레젠테이션 설명자는 특정 프레젠테이션에 대한 설명을 포함하는 개체입니다. 프레젠테이션 설명자는 미디어 원본 및 일부 미디어 싱크를 구성하는 데 사용됩니다.

각 프레젠테이션 설명자에는 하나 이상의 스트림 설명자 목록이 포함되어 있습니다. 프레젠테이션의 스트림에 대해 설명합니다. 스트림 선택하거나 선택 취소할 수 있습니다. 선택한 스트림만 데이터를 생성합니다. 선택 취소된 스트림은 활성 상태이며 데이터를 생성하지 않습니다. 각 스트림 설명자에는 스트림의 미디어 형식을 변경하거나 스트림의 현재 미디어 형식을 가져오는 데 사용되는 미디어 형식 처리기가 있습니다. (미디어 형식에 대한 자세한 내용은 미디어 형식을 참조하세요.)

다음 표에서는 이러한 각 개체가 노출하는 기본 인터페이스를 보여 줍니다.

Object 인터페이스
프레젠테이션 설명자 IMFPresentationDescriptor
스트림 설명자 IMFStreamDescriptor
미디어 형식 처리기 IMFMediaTypeHandler

 

미디어 원본 프레젠테이션

모든 미디어 원본은 원본의 기본 구성을 설명하는 프레젠테이션 설명자를 제공합니다. 기본 구성에서 하나 이상의 스트림이 선택되고 선택한 모든 스트림에는 미디어 유형이 있습니다. 프레젠테이션 설명자를 얻으려면 IMFMediaSource::CreatePresentationDescriptor를 호출합니다. 이 메서드는 IMFPresentationDescriptor 포인터를 반환합니다.

원본의 프레젠테이션 설명자를 수정하여 다른 스트림 집합을 선택할 수 있습니다. 미디어 원본이 중지되지 않는 한 프레젠테이션 설명자를 수정하지 마세요. 변경 내용은 IMFMediaSource::Start 를 호출하여 원본을 시작할 때 적용됩니다.

스트림 수를 얻으려면 IMFPresentationDescriptor::GetStreamDescriptorCount를 호출합니다. 스트림에 대한 스트림 설명자를 얻으려면 IMFPresentationDescriptor::GetStreamDescriptorByIndex 를 호출하고 스트림의 인덱스를 전달합니다. 스트림 0부터 인덱싱됩니다. GetStreamDescriptorByIndex 메서드는 IMFStreamDescriptor 포인터를 반환합니다. 또한 스트림이 선택되었는지 여부를 나타내는 부울 플래그를 반환합니다. 스트림을 선택하면 미디어 원본이 해당 스트림에 대한 데이터를 생성합니다. 그렇지 않으면 원본이 해당 스트림에 대한 데이터를 생성하지 않습니다. 스트림을 선택하려면 스트림의 인덱 스를 사용하여 IMFPresentationDescriptor::SelectStream 을 호출합니다. 스트림의 선택을 취소하려면 IMFPresentationDescriptor::D eselectStream을 호출합니다.

다음 코드에서는 미디어 소스에서 프레젠테이션 설명자를 가져와서 스트림을 열거하는 방법을 보여 줍니다.

HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL  fSelected = FALSE;

IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;

hr = pSource->CreatePresentationDescriptor(&pPresentation);

if (SUCCEEDED(hr))
{
    hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}

if (SUCCEEDED(hr))
{
    for (DWORD iStream = 0; iStream < cStreams; iStream++)
    {
        hr = pPresentation->GetStreamDescriptorByIndex(
            iStream, &fSelected, &pStreamDesc);

        if (FAILED(hr))
        {
            break;
        }

        /*  Use the stream descriptor. (Not shown.) */

        SAFE_RELEASE(pStreamDesc);
    }
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);

미디어 형식 처리기

스트림의 미디어 형식을 변경하거나 스트림의 현재 미디어 형식을 얻으려면 스트림 설명자의 미디어 형식 처리기를 사용합니다. IMFStreamDescriptor::GetMediaTypeHandler를 호출하여 미디어 형식 처리기를 가져옵니다. 이 메서드는 IMFMediaTypeHandler 포인터를 반환합니다.

오디오 또는 비디오와 같이 스트림에 있는 데이터의 종류를 알고 싶다면 IMFMediaTypeHandler::GetMajorType을 호출합니다. 이 메서드는 주 미디어 형식에 대한 GUID를 반환합니다. 예를 들어 재생 애플리케이션은 일반적으로 오디오 스트림을 오디오 렌더러에 연결하고 비디오 스트림을 비디오 렌더러에 연결합니다. 미디어 세션 또는 토폴로지 로더를 사용하여 토폴로지를 빌드하는 경우 주 형식 GUID가 필요한 유일한 형식 정보일 수 있습니다.

애플리케이션에 현재 형식에 대한 자세한 정보가 필요한 경우 IMFMediaTypeHandler::GetCurrentMediaType을 호출합니다. 이 메서드는 미디어 형식의 IMFMediaType 인터페이스에 대한 포인터를 반환합니다. 이 인터페이스를 사용하여 형식의 세부 정보를 가져옵니다.

미디어 형식 처리기에는 스트림에 대해 지원되는 미디어 형식 목록도 포함됩니다. 목록의 크기를 얻으려면 IMFMediaTypeHandler::GetMediaTypeCount를 호출합니다. 목록에서 미디어 형식을 얻으려면 미디어 형식의 인덱스를 사용하여 IMFMediaTypeHandler::GetMediaTypeByIndex 를 호출합니다. 미디어 형식은 대략적인 기본 설정 순서로 반환됩니다. 예를 들어 오디오 형식의 경우 낮은 샘플 속도보다 더 높은 샘플 속도가 선호됩니다. 그러나 순서를 제어하는 확실한 규칙은 없으므로 단순히 지침으로 처리해야 합니다.

지원되는 형식 목록에는 스트림이 지원하는 모든 가능한 미디어 형식이 포함되지 않을 수 있습니다. 특정 미디어 형식이 지원되는지 테스트하려면 IMFMediaTypeHandler::IsMediaTypeSupported를 호출합니다. 미디어 유형을 설정하려면 IMFMediaTypeHandler::SetCurrentMediaType을 호출합니다. 메서드가 성공하면 스트림에 지정된 형식을 준수하는 데이터가 포함됩니다. SetCurrentMediaType 메서드는 기본 설정 형식 목록을 변경하지 않습니다.

다음 코드에서는 미디어 형식 처리기를 가져와 기본 설정 미디어 형식을 열거하고 미디어 형식을 설정하는 방법을 보여 있습니다. 이 예제에서는 애플리케이션에 미디어 형식을 선택하기 위해 여기에 표시되지 않은 일부 알고리즘이 있다고 가정합니다. 구체적인 내용은 애플리케이션에 따라 크게 달라집니다.

HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL  bTypeOK = FALSE;

IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;

hr = pStreamDesc->GetMediaTypeHandler(&pHandler);

if (SUCCEEDED(hr))
{
    hr = pHandler->GetMediaTypeCount(&cTypes);
}

if (SUCCEEDED(hr))
{
    for (DWORD iType = 0; iType < cTypes; iType++)
    {   
        hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);

        if (FAILED(hr))
        {
            break;
        }

        /* Examine the media type. (Not shown.)  */

        /* If this media type is acceptable, set the media type. */

        if (bTypeOK)
        {
            hr = pHandler->SetCurrentMediaType(pMediaType);
            break;
        }

        SAFE_RELEASE(pMediaType);
    }
}    

SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);

미디어 원본

Media Foundation 플랫폼 API