次の方法で共有


手順 1: DShowPlayer クラスを宣言する

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 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 でのオーディオ/ビデオ再生