다음을 통해 공유


미디어 형식 협상

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

Filter Graph Manager가 IPin::Connect 메서드를 호출할 때 미디어 형식을 지정하는 몇 가지 옵션이 있습니다.

  • 전체 형식: 미디어 형식이 완전히 지정된 경우 핀은 해당 형식과 연결을 시도합니다. 연결할 수 없는 경우 연결 시도가 실패합니다.
  • 부분 미디어 유형: 미디어 형식은 주 형식, 하위 형식 또는 형식 형식이 GUID_NULL 경우 부분 입니다. GUID_NULL 값은 모든 값이 허용 가능함을 나타내는 "와일드카드"로 작동합니다. 핀은 부분 형식과 일치하는 형식을 협상합니다.
  • 미디어 유형 없음: 필터 그래프 관리자가 NULL 포인터를 전달하는 경우 핀은 두 핀에 모두 허용되는 미디어 형식에 동의할 수 있습니다.

핀이 연결되면 연결에는 항상 전체 미디어 유형이 있습니다. Filter Graph Manager에서 제공하는 미디어 형식의 목적은 가능한 연결 유형을 제한하는 것입니다.

협상 프로세스 중에 출력 핀은 입력 핀의 IPin::ReceiveConnection 메서드를 호출하여 미디어 형식을 제안합니다. 입력 핀은 제안된 형식을 수락하거나 거부할 수 있습니다. 이 프로세스는 입력 핀이 형식을 수락하거나 출력 핀의 형식이 부족하고 연결이 실패할 때까지 반복됩니다.

출력 핀이 제안할 미디어 형식을 선택하는 방법은 구현에 따라 달라집니다. DirectShow 기본 클래스에서 출력 핀은 입력 핀에서 IPin::EnumMediaTypes 를 호출합니다. 이 메서드는 입력 핀의 기본 미디어 형식을 열거하는 열거자를 반환합니다. 실패하면 출력 핀이 자체 기본 설정 형식을 열거합니다.

미디어 형식 작업

AM_MEDIA_TYPE 매개 변수를 수신하는 함수에서 pbFormat 멤버를 역참조하기 전에 항상 cbFormatformattype 값의 유효성을 검사합니다. 다음 코드가 잘못되었습니다.

if (pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Wrong!
}

다음 코드가 정확합니다.

if ((pmt->formattype == FORMAT_VideoInfo) && 
    (pmt->cbFormat > sizeof(VIDEOINFOHEADER) &&
    (pbFormat != NULL))
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can dereference pVIH.
}