Поделиться через


Шаг 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

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

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