다음을 통해 공유


2단계: CVideoRenderer 및 파생 클래스 선언

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

이 항목은 DirectShow의 오디오/비디오 재생 자습서의 2단계입니다. 전체 코드는 DirectShow 재생 예제 항목에 나와 있습니다.

DirectShow는 비디오를 렌더링하는 여러 가지 필터를 제공합니다.

이러한 필터 간의 차이점에 대한 자세한 내용은 올바른 비디오 렌더러 선택을 참조하세요.

이 자습서에서는 다음 추상 클래스를 사용하여 비디오 렌더러 필터를 래핑합니다.

// 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의 IBaseFilterIMFVideoDisplayControl 인터페이스에 대한 포인터가 포함되어 있습니다.

// 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단계: 필터 그래프 빌드

DirectShow의 오디오/비디오 재생

비디오 믹싱 렌더러 사용

비디오 렌더링