Шаг 2. Объявление CVideoRenderer и производных классов

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и захват аудио и видео в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

В этом разделе приведен шаг 2 руководства воспроизведение звука и видео в DirectShow. Полный код показан в разделе примере воспроизведения 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 обрабатывает изменения в режиме отображения.

Каждый из этих методов подробно описан далее в этом руководстве.

Затем объявите производный класс для упаковки каждого из трех отрисовщиков видео: EVR, VMR-9 и VMR-7.

Класс CEVR

Класс CEVR управляет EVR. Он содержит указатель на интерфейсы IBaseFilter и IMFVideoDisplayControl в EVR.

// 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

Использование видеомикшера

Рендеринг видео