步驟 1:宣告 DShowPlayer 類別
[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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 和衍生類別。
相關主題