手順 2: CVideoRenderer クラスと派生クラスを宣言する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
このトピックは、 DirectShow でのオーディオ/ビデオ再生に関するチュートリアルの手順 2 です。 完全なコードは、「 DirectShow 再生の例」トピックに示されています。
DirectShow には、ビデオをレンダリングするいくつかの異なるフィルターが用意されています。
- 拡張ビデオ レンダラー フィルター (EVR)
- ビデオ 混合レンダラー フィルター 9 (VMR-9)
- ビデオ 混合レンダラー フィルター 7 (VMR-7)
これらのフィルターの違いの詳細については、「 適切なビデオ レンダラーの選択」を参照してください。
このチュートリアルでは、次の抽象クラスを使用して、ビデオ レンダラー フィルターをラップします。
// 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();
};
関連トピック