Шаг 2. Объявление CVideoRenderer и производных классов
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
Этот раздел является шагом 2 руководства По воспроизведению звука и видео в DirectShow. Полный код показан в разделе Пример воспроизведения 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
обрабатывает изменения в режиме отображения.
Каждый из этих методов подробно описан далее в этом руководстве.
Затем объявите производный класс для переноса каждого из трех отрисовщиков видео: 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. Создание графа фильтров.
Связанные темы