次の方法で共有


手順 2: CVideoRenderer クラスと派生クラスを宣言する

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

これらの各方法については、このチュートリアルの後半で詳しく説明します。

次に、3 つのビデオ レンダラー (EVR、VMR-9、VMR-7) をそれぞれラップする派生クラスを宣言します。

CEVR クラス

クラスは CEVR 、EVR を管理します。 これには、EVR の IBaseFilter インターフェイスと IMFVideoDisplayControl インターフェイスへのポインターが含まれています。

// 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 でのオーディオ/ビデオ再生

ビデオ 混合レンダラーの使用

ビデオのレンダリング