다음을 통해 공유


캡처 그래프 제어

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

Filter Graph Manager의 IMediaControl 인터페이스에는 전체 그래프를 실행, 중지 및 일시 중지하는 메서드가 있습니다. 그러나 필터 그래프에 캡처 및 미리 보기 스트림이 있는 경우 두 스트림을 독립적으로 제어하려고 할 수 있습니다. 예를 들어 비디오를 캡처하지 않고 미리 볼 수 있습니다. ICaptureGraphBuilder2::ControlStream 메서드를 통해 이 작업을 수행할 수 있습니다.

참고

이 메서드는 ASF(Advanced Systems Format) 파일로 캡처할 때 작동하지 않습니다.

 

캡처 스트림 제어

다음 코드는 그래프가 실행된 후 1초부터 시작하여 비디오 캡처 스트림을 4초 동안 실행하도록 설정합니다.

// Control the video capture stream. 
REFERENCE_TIME rtStart = 10000000, rtStop = 50000000;
const WORD wStartCookie = 1, wStopCookie = 2;  // Arbitrary values.
hr = pBuild->ControlStream(
    &PIN_CATEGORY_CAPTURE, // Pin category.
    &MEDIATYPE_Video,      // Media type.
    pCap,                 // Capture filter.
    &rtStart, &rtStop,     // Start and stop times.
    wStartCookie, wStopCookie  // Values for the start and stop events.
);
pControl->Run();

첫 번째 매개 변수는 제어할 스트림을 핀 범주 GUID로 지정합니다. 두 번째 매개 변수는 미디어 형식을 제공합니다. 세 번째 매개 변수는 캡처 필터에 대한 포인터입니다. 그래프의 모든 캡처 스트림을 제어하려면 두 번째 및 세 번째 매개 변수를 NULL로 설정합니다.

다음 두 매개 변수는 그래프 실행을 시작하는 시간을 기준으로 스트림이 시작되고 중지되는 시간을 정의합니다. IMediaControl::Run을 호출하여 그래프를 실행합니다. 그래프를 실행할 때까지 ControlStream 메서드는 영향을 주지 않습니다. 그래프가 이미 실행 중인 경우 설정이 즉시 적용됩니다.

마지막 두 매개 변수는 스트림이 시작되고 중지되는 경우 이벤트 알림을 받는 데 사용됩니다. 이 메서드를 사용하여 제어하는 각 스트림에 대해 필터 그래프는 스트림이 시작될 때 EC_STREAM_CONTROL_STARTED 스트림이 중지되면 EC_STREAM_CONTROL_STOPPED 이벤트 쌍을 보냅니다. wStartCookiewStopCookie의 값은 두 번째 이벤트 매개 변수로 사용됩니다. 따라서 start 이벤트의 lParam2wStartCookie와 같고 stop 이벤트의 lParam2wStopCookie와 같습니다. 다음 코드는 이러한 이벤트를 가져오는 방법을 보여 줍니다.

while (hr = pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))
{
    switch (evCode)
    {
    case EC_STREAM_CONTROL_STARTED: 
    // param2 == wStartCookie
    break;

    case EC_STREAM_CONTROL_STOPPED: 
    // param2 == wStopCookie
    break;
    
    } 
    pEvent->FreeEventParams(evCode, param1, param2);
}

ControlStream 메서드는 시작 및 중지 시간에 대한 몇 가지 특수 값을 정의합니다.

시작 Stop
MAXLONGLONG 이 스트림을 시작하지 마세요. 그래프가 중지될 때까지 중지하지 마세요.
NULL 그래프가 실행되면 즉시 시작합니다. 즉시 중지합니다.

 

예를 들어 다음 코드는 캡처 스트림을 즉시 중지합니다.

pBuild->ControlStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
    0, 0,     // Start and stop times.
    wStartCookie, wStopCookie); 

캡처 스트림을 중지하고 나중에 다시 시작할 수 있지만 타임스탬프는 간격을 만듭니다. 재생 시 비디오는 파일 형식에 따라 간격 중에 중단된 것처럼 보입니다.

미리 보기 스트림 제어

미리 보기 핀을 제어하려면 ControlStream 을 호출하지만 첫 번째 매개 변수를 PIN_CATEGORY_PREVIEW 설정합니다. 이는 미리 보기 프레임에 타임스탬프가 없기 때문에 참조 시간을 사용하여 시작 및 중지를 지정할 수 없다는 점을 제외하고 PIN_CATEGORY_CAPTURE 경우와 마찬가지로 작동합니다. 따라서 NULL 또는 MAXLONGLONG을 사용해야 합니다. NULL을 사용하여 미리 보기 스트림을 시작합니다.

pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
    NULL,    // Start now.
    0,       // (Don't care.)
    wStartCookie, wStopCookie); 

MAXLONGLONG을 사용하여 미리 보기 스트림을 중지합니다.

pBuild->ControlStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
    0,               // (Don't care.)
    MAXLONGLONG,     // Stop now.
    wStartCookie, wStopCookie); 

미리 보기 스트림이 캡처 필터의 미리 보기 핀에서 제공되는지 또는 스마트 티 필터에서 제공되는지는 중요하지 않습니다. ControlStream 메서드는 어느 쪽이든 작동합니다.

그러나 비디오 포트 핀의 경우 메서드가 실패합니다. 이 경우 또 다른 방법은 비디오 창을 숨기는 것입니다. IVideoWindow에 대한 그래프를 쿼리하고 IVideoWindow::p ut_Visible 메서드를 사용하여 창을 표시하거나 숨깁니다.

// Hide the video window.
IVideoWindow *pVidWin = 0;
hr = pGraph->QueryInterface(IID_IVideoWindow, (void**)&pVidWin);
if (SUCCEEDED(hr))
{
    pVidWin->put_Visible(OAFALSE);
    pVidWin->Release();
}

또한 그래프를 실행하기 전에 OAFALSE 값으로 IVideoWindow::p ut_AutoShow 를 호출하는 경우 Video Renderer 필터는 달리 지정할 때까지 창을 숨깁니다. 기본적으로 Video Renderer는 그래프를 실행할 때 창을 표시합니다.

스트림 제어에 대한 설명

핀의 기본 동작은 그래프가 실행되면 샘플을 전달하는 것입니다. 예를 들어 PIN_CATEGORY_CAPTURE 사용하여 ControlStream 을 호출하지만 PIN_CATEGORY_PREVIEW 호출하지 않는다고 가정합니다. 그래프를 실행하면 미리 보기 스트림이 즉시 실행되고 캡처 스트림은 ControlStream에서 지정한 시간에 실행됩니다.

둘 이상의 스트림을 캡처하여 mux 필터로 보내는 경우(예: 오디오 및 비디오를 AVI 파일로 캡처하는 경우) 두 스트림을 동시에 제어해야 합니다. 그렇지 않으면 mux 필터가 두 스트림을 인터리브하려고 할 때 하나의 스트림 대기를 차단할 수 있습니다. 그래프를 실행하기 전에 모든 캡처 스트림에서 동일한 시작 및 중지 시간을 설정합니다.

pBuild->ControlStream(&PIN_CATEGORY_CAPTURE, 
    
NULL, NULL,       // All capture streams.
    &rtStart, rtStop, 
    wStartCookie, wStopCookie); 

내부적으로 ControlStream 메서드는 캡처 필터의 핀에 노출되는 IAMStreamControl 인터페이스, 스마트 티 필터(있는 경우) 및 mux 필터를 사용합니다. ControlStream을 호출하는 대신 이 인터페이스를 직접 사용할 수 있지만 이 인터페이스는 특별한 이점이 없습니다.

비디오 캡처