다음을 통해 공유


1단계: DShowPlayer 클래스 선언

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

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

이 자습서에서 클래스는 DShowPlayer 모든 DirectShow 기능을 관리합니다. 이 클래스는 folow로 선언됩니다.

#include <new>
#include <windows.h>
#include <dshow.h>


enum PlaybackState
{
    STATE_NO_GRAPH,
    STATE_RUNNING,
    STATE_PAUSED,
    STATE_STOPPED,
};

const UINT WM_GRAPH_EVENT = WM_APP + 1;

typedef void (CALLBACK *GraphEventFN)(HWND hwnd, long eventCode, LONG_PTR param1, LONG_PTR param2);

class DShowPlayer
{
public:
    DShowPlayer(HWND hwnd);
    ~DShowPlayer();

    PlaybackState State() const { return m_state; }

    HRESULT OpenFile(PCWSTR pszFileName);
    
    HRESULT Play();
    HRESULT Pause();
    HRESULT Stop();

    BOOL    HasVideo() const;
    HRESULT UpdateVideoWindow(const LPRECT prc);
    HRESULT Repaint(HDC hdc);
    HRESULT DisplayModeChanged();

    HRESULT HandleGraphEvent(GraphEventFN pfnOnGraphEvent);

private:
    HRESULT InitializeGraph();
    void    TearDownGraph();
    HRESULT CreateVideoRenderer();
    HRESULT RenderStreams(IBaseFilter *pSource);

    PlaybackState   m_state;

    HWND m_hwnd; // Video window. This window also receives graph events.

    IGraphBuilder   *m_pGraph;
    IMediaControl   *m_pControl;
    IMediaEventEx   *m_pEvent;
    CVideoRenderer  *m_pVideo;
};

참고:

  • 열거형은 PlaybackState 개체의 DShowPlayer 현재 상태를 설명합니다.
  • 상수 WM_GRAPH_EVENT 프라이빗 창 메시지를 정의합니다. 이 메시지는 필터 그래프 이벤트에 대해 애플리케이션에 알리는 데 사용됩니다. 6단계: 그래프 이벤트 처리를 참조하세요.
  • GraphEventFN 는 필터 그래프 이벤트를 처리하기 위한 콜백 함수에 대한 포인터입니다. 애플리케이션은 이 콜백 함수를 구현합니다.
  • m_pVideo 멤버 변수는 다양한 DirectShow 비디오 렌더러에 대한 래퍼를 제공합니다. 2단계: CVideoRenderer 및 파생 클래스 선언을 참조하세요.
  • 이 자습서 전체에서 SafeRelease 함수는 COM 인터페이스 포인터를 해제하는 데 사용됩니다.

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

DirectShow의 오디오/비디오 재생