캡처 필터에서 데이터 생성
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 항목에서는 사용자 지정 DirectShow 캡처 필터가 출력 데이터를 생성하는 방법을 설명합니다.
상태 변경 내용 필터링
캡처 필터는 필터가 실행 중인 경우에만 데이터를 생성해야 합니다. 필터가 일시 중지된 경우 핀에서 데이터를 보내지 마세요. 또한 필터가 일시 중지되면 CBaseFilter::GetState 메서드에서 VFW_S_CANT_CUE 반환합니다. 이 반환 값은 필터가 일시 중지되는 동안 필터의 데이터를 기다리지 않아야 한다는 것을 Filter Graph Manager에 알릴 수 있습니다. 자세한 내용은 필터 상태를 참조하세요.
다음 코드는 IMediaFilter::GetState 메서드를 구현하는 방법을 보여줍니다.
CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
CheckPointer(pState, E_POINTER);
*pState = m_State;
if (m_State == State_Paused)
{
return VFW_S_CANT_CUE;
}
else
{
return S_OK;
}
}
개별 스트림 제어
캡처 필터의 출력 핀은 애플리케이션이 각 핀을 개별적으로 켜거나 끌 수 있도록 IAMStreamControl 인터페이스를 지원해야 합니다. 예를 들어 애플리케이션은 캡처하지 않고 미리 본 다음 필터 그래프를 다시 빌드하지 않고 캡처 모드로 전환할 수 있습니다. CBaseStreamControl 클래스를 사용하여 이 인터페이스를 구현할 수 있습니다.
타임스탬프
필터가 샘플을 캡처하면 현재 스트림 시간으로 샘플을 타임스탬프를 지정합니다. 종료 시간은 시작 시간과 기간을 더한 시간입니다. 예를 들어 필터가 초당 10개의 샘플에서 캡처되고 필터가 샘플을 캡처할 때 스트림 시간이 200,000,000 단위인 경우 타임스탬프는 20000000000 및 2010000000이어야 합니다. (초당 10,000,000개 단위가 있습니다.)
스트림 시간을 계산하려면 IReferenceClock::GetTime 메서드를 호출하여 현재 참조 시간을 구한 다음 원래 시작 시간을 뺍니다. 또는 동일한 계산을 수행하는 CBaseFilter::StreamTime 메서드를 호출합니다. 샘플에서 타임스탬프를 설정하려면 IMediaSample::SetTime 메서드를 호출합니다.
그러나 필터에 미리 보기 핀이 있는 경우 미리 보기 핀의 샘플에는 타임스탬프를 포함하지 않아야 합니다. 그 이유는 샘플이 캡처 시간 이후에 항상 렌더러에 약간 도달하기 때문입니다. 샘플에 타임스탬프를 적용하면 렌더러는 이를 늦게 처리하고 샘플을 삭제하여 따라잡으려고 시도할 수 있습니다. 자세한 내용은 DirectShow Video Capture Filters(DirectShow Video Capture Filters)를 참조하세요. IAMStreamControl 인터페이스는 샘플 시간을 추적하기 위해 핀이 필요합니다. 미리 보기 핀의 경우 타임스탬프를 사용하지 않도록 구현을 수정해야 할 수 있습니다.
타임스탬프는 항상 한 샘플에서 다음 샘플로 증가해야 합니다. 필터가 일시 중지되는 경우에도 마찬가지입니다. 필터가 실행되고 일시 중지된 다음 다시 실행되면 일시 중지 후 첫 번째 샘플은 일시 중지 전 마지막 샘플보다 더 큰 타임스탬프를 가져야 합니다.
캡처하는 데이터에 따라 샘플에서 미디어 시간을 설정하는 것이 적절할 수 있습니다.
자세한 내용은 DirectShow의 시간 및 시계를 참조하세요.
관련 항목