共用方式為


步驟 1:宣告 DShowPlayer 類別

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

本主題是 DirectShow 中音訊/視訊播放教學課程的步驟 1。 完整的程式碼會顯示在 DirectShow 播放範例主題中。

在本教學課程中,類別 DShowPlayer 會管理所有 DirectShow 功能。 這個類別宣告為 folows。

#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 中的音訊/視訊播放