비디오 캡처 및 미리 보기 결합

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

이전 섹션에서는 다양한 파일 형식으로 비디오를 캡처하는 방법을 설명합니다. 비디오 미리 보기 섹션에서는 라이브 미리 보기 그래프를 빌드하는 방법을 설명합니다. 그러나 많은 애플리케이션이 한 번에 둘 다 수행해야 합니다. 결합된 미리 보기 및 파일 쓰기 그래프를 빌드하려면 ICaptureGraphBuilder2::RenderStream을 두 개 호출하면 됩니다.

// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, 
    NULL, NULL);

// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, 
    NULL, pMux);

이 코드에서 캡처 그래프 작성기는 몇 가지 세부 정보를 숨기고 있습니다.

  • 캡처 필터에 미리 보기 핀 또는 비디오 포트 핀과 캡처 핀이 있는 경우 RenderStream 메서드는 다음 그림과 같이 두 핀을 렌더링합니다.

    그래프 캡처 및 미리 보기

  • 필터에 캡처 핀만 있는 경우 캡처 그래프 작성기에서 스마트 티 필터를 사용하여 캡처 스트림을 분할합니다. 다음 그림에서는 스마트 티가 있는 그래프를 보여 줍니다.

    스마트 티 필터를 사용하여 그래프 캡처 및 미리 보기

스마트 티 필터에는 캡처 핀과 미리 보기 핀이 있습니다. 캡처 필터에서 단일 비디오 스트림을 가져와 캡처용과 미리 보기용으로 하나씩 두 개의 스트림으로 분할합니다. 캡처 핀의 처리량을 유지하기 위해 미리 보기 핀은 필요에 따라 프레임을 삭제합니다. 또한 DirectShow 비디오 캡처 필터 항목에 설명된 이유로 전달하기 전에 각 샘플의 타임스탬프를 제거합니다.

스마트 티는 스트림을 분할하지만 비디오 데이터를 물리적으로 복제하지는 않습니다. 대신 버퍼를 공유하는 사용자 지정 미디어 샘플 개체를 사용합니다. 샘플은 다운스트림 필터가 데이터에 기록되지 않도록 "읽기 전용"으로 표시됩니다.

캡처 그래프에 미리 보기 창이 있는 경우 Filter Graph Manager에서 캡처 스트림을 포함하여 전체 그래프를 중지할 수 있는 몇 가지 사항이 있습니다.

  • 컴퓨터를 잠급 수 있습니다.
  • 도메인의 구성원인 컴퓨터에서 Ctrl+Alt+DELETE를 누릅니다.
  • 전체 화면 Direct3D 애플리케이션(예: 게임 또는 화면 보호기)을 실행합니다.
  • 모니터를 전환하거나 디스플레이 해상도를 변경합니다.
  • Windows에서 UAC(사용자 계정 컨트롤) 대화 상자를 표시하도록 하는 프로그램을 실행합니다. (Windows Vista 이상)
  • 전체 화면 DOS 창 실행

이러한 이벤트 중에서 캡처 세션이 중단되어 데이터가 손실될 수 있습니다. (내부적으로 발생하는 작업은 다음과 같습니다. 비디오 렌더러는 필요한 Direct3D 또는 DirectDraw 리소스를 잃게 됩니다. 이러한 리소스를 복구하는 과정에서 비디오 렌더러는 업스트림 필터와 다시 연결해야 하므로 필터 그래프 관리자가 그래프를 중지합니다.)

이 문제에 대한 두 가지 가능한 해결 방법은 다음과 같습니다.

  • 미리 보기 스트림을 포함하지 마세요. 그러나 캡처 디바이스에 비디오 포트 핀이 있는 경우 ICaptureGraphBuilder2::RenderStream 메서드가 자동으로 미리 보기 창을 추가합니다. 파일 캡처의 비디오 포트 핀을 참조하세요.
  • 스트림 버퍼 엔진을 사용하여 미리 보기 스트림을 다른 프로세스의 그래프로 보냅니다.

파일에 비디오 캡처