[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, Media Foundation 오디오/비디오 캡처대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngine 및 Audio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 항목에서는 사용자 지정 DirectShow 캡처 필터가 출력 데이터를 생성하는 방법에 대해 설명합니다.
상태 변경 내용 필터링
캡처 필터는 필터가 실행 중일 때만 데이터를 생성해야 합니다. 필터가 일시 중지된 경우 핀에서 데이터를 보내지 마세요. 또한 필터가 일시 중지되면 CBaseFilter::GetState 메서드에서 VFW_S_CANT_CUE 반환합니다. 이 반환 값은 필터가 일시 중지되는 동안 필터 그래프 관리자에게 필터의 데이터를 기다리지 말라는 것을 알립니다. 자세한 내용은 필터 상태참조하세요.
다음 코드는 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 단위인 경우 타임스탬프는 2000000000 및 2010000000이어야 합니다. (초당 10,000,000 단위가 있습니다.)
스트림 시간을 계산하려면 IReferenceClock::GetTime 메서드를 호출하여 현재 참조 시간을 구한 다음 원래 시작 시간을 뺍니다. 또는 동일한 계산을 수행하는 CBaseFilter::StreamTime 메서드를 호출합니다. 샘플에서 타임스탬프를 설정하려면 IMediaSample::SetTime 메서드를 호출합니다.
그러나 필터에 미리 보기 핀이 있는 경우 미리 보기 핀의 샘플에는 타임스탬프를 포함하지 않아야 합니다. 그 이유는 샘플이 캡처 시간 이후에 항상 렌더러에 약간 도달하기 때문입니다. 샘플에 타임스탬프가 적용되면 렌더러는 이를 늦은 것으로 간주하며, 따라잡기 위해 샘플을 드랍할 수 있습니다. (자세한 내용은 DirectShow 비디오 캡처 필터참조하세요.) IAMStreamControl 인터페이스에는 샘플 시간을 추적하기 위해 핀이 필요합니다. 미리 보기 핀의 경우 타임스탬프를 사용하지 않도록 구현을 수정해야 할 수 있습니다.
타임스탬프는 항상 한 샘플에서 다음 샘플로 증가해야 합니다. 필터가 일시 중지되는 경우에도 마찬가지입니다. 필터가 실행되고 일시 중지된 다음 다시 실행되면 일시 중지 후 첫 번째 샘플은 일시 중지 전 마지막 샘플보다 더 큰 타임스탬프를 가져야 합니다.
캡처하는 데이터에 따라 샘플에서 미디어 시간을 설정하는 것이 적절할 수 있습니다.
자세한 내용은 DirectShow 시간 및 시계를 참조하세요.
관련 항목