Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, 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. Создание графа фильтра.
Связанные разделы