2단계: CVideoRenderer 및 파생 클래스 선언
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
이 항목은 DirectShow의 오디오/비디오 재생 자습서의 2단계입니다. 전체 코드는 DirectShow 재생 예제 항목에 나와 있습니다.
DirectShow는 비디오를 렌더링하는 여러 가지 필터를 제공합니다.
- 향상된 비디오 렌더러 필터 (EVR)
- 비디오 혼합 렌더러 필터 9 (VMR-9)
- 비디오 혼합 렌더러 필터 7 (VMR-7)
이러한 필터 간의 차이점에 대한 자세한 내용은 올바른 비디오 렌더러 선택을 참조하세요.
이 자습서에서는 다음 추상 클래스를 사용하여 비디오 렌더러 필터를 래핑합니다.
// Abstract class to manage the video renderer filter.
// Specific implementations handle the VMR-7, VMR-9, or EVR filter.
class CVideoRenderer
{
public:
virtual ~CVideoRenderer() {};
virtual BOOL HasVideo() const = 0;
virtual HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd) = 0;
virtual HRESULT FinalizeGraph(IGraphBuilder *pGraph) = 0;
virtual HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc) = 0;
virtual HRESULT Repaint(HWND hwnd, HDC hdc) = 0;
virtual HRESULT DisplayModeChanged() = 0;
};
참고:
- 메서드는
HasVideo
비디오 렌더러가 만들어진 경우 TRUE 를 반환합니다. - 메서드는
AddToGraph
필터 그래프에 비디오 렌더러를 추가합니다. - 메서드는
FinalizeGraph
그래프 작성 단계를 완료합니다. - 메서드는
UpdateVideoWindow
비디오 대상 사각형을 업데이트합니다. - 메서드는
Repaint
현재 비디오 프레임을 다시 그어 줍니다. - 메서드는
DisplayModeChanged
디스플레이 모드 변경 내용을 처리합니다.
이러한 각 메서드는 이 자습서의 뒷부분에서 자세히 설명합니다.
다음으로, EVR, VMR-9 및 VMR-7의 세 비디오 렌더러를 각각 래핑하는 파생 클래스를 선언합니다.
CEVR 클래스
클래스는 CEVR
EVR을 관리합니다. 여기에는 EVR의 IBaseFilter 및 IMFVideoDisplayControl 인터페이스에 대한 포인터가 포함되어 있습니다.
// Manages the EVR video renderer filter.
class CEVR : public CVideoRenderer
{
IBaseFilter *m_pEVR;
IMFVideoDisplayControl *m_pVideoDisplay;
public:
CEVR();
~CEVR();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
CVMR9 클래스
클래스는 CVMR9
VMR-9를 관리합니다.
IVMRWindowlessControl9 인터페이스에 대한 포인터가 포함되어 있습니다.
// Manages the VMR-9 video renderer filter.
class CVMR9 : public CVideoRenderer
{
IVMRWindowlessControl9 *m_pWindowless;
public:
CVMR9();
~CVMR9();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
CVMR7 클래스
클래스는 CVMR7
VMR-7을 관리합니다.
IVMRWindowlessControl 인터페이스에 대한 포인터를 포함합니다.
// Manages the VMR-7 video renderer filter.
class CVMR7 : public CVideoRenderer
{
IVMRWindowlessControl *m_pWindowless;
public:
CVMR7();
~CVMR7();
BOOL HasVideo() const;
HRESULT AddToGraph(IGraphBuilder *pGraph, HWND hwnd);
HRESULT FinalizeGraph(IGraphBuilder *pGraph);
HRESULT UpdateVideoWindow(HWND hwnd, const LPRECT prc);
HRESULT Repaint(HWND hwnd, HDC hdc);
HRESULT DisplayModeChanged();
};
다음: 3단계: 필터 그래프 빌드
관련 항목