캡처 그래프 제어
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media 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 이벤트 쌍을 보냅니다. wStartCookie 및 wStopCookie의 값은 두 번째 이벤트 매개 변수로 사용됩니다. 따라서 start 이벤트의 lParam2 는 wStartCookie와 같고 stop 이벤트의 lParam2 는 wStopCookie와 같습니다. 다음 코드는 이러한 이벤트를 가져오는 방법을 보여 줍니다.
while (hr = pEvent->GetEvent(&evCode, ¶m1, ¶m2, 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을 호출하는 대신 이 인터페이스를 직접 사용할 수 있지만 이 인터페이스는 특별한 이점이 없습니다.
관련 항목