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

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

Заметка

Устаревший фильтр отрисовщика видео всегда использует режим окна. Фильтры VMR-7 и VMR-9 используют режим окна по умолчанию, но также поддерживают режим без окон.

 

В оконном режиме отрисовщик видео создает собственное окно, в котором он отрисовывает видеокадры. Если вы не указали другое, это окно верхнего уровня с собственными границами и строкой заголовка. Однако большую часть времени вы прикрепите окно видео к окну приложения, чтобы видео было интегрировано в пользовательский интерфейс приложения. Для этого необходимо выполнить следующие действия.

  1. Запрос IVideoWindow.
  2. Задайте родительское окно.
  3. Задайте новые стили окон.
  4. Размещение окна видео внутри окна владельца.
  5. Уведомите окно видео о сообщениях WM_MOVE.

запрос для IVideoWindow

Перед началом воспроизведения выполните запрос к диспетчеру графов фильтров для интерфейса IVideoWindow:

IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);

Установить родительское окно

Чтобы задать родительское окно, вызовите метод IVideoWindow::put_Owner с дескриптором окна приложения. Этот метод принимает переменную типа OAHWND, так что приведите дескриптор к этому типу:

pVidWin->put_Owner((OAHWND)hwnd);

Установить новые стили окон

Измените стиль окна видео, вызвав метод IVideoWindow::put_WindowStyle:

pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

Флаг WS_CHILD устанавливает окно как дочернее, а флаг WS_CLIPSIBLINGS предотвращает прорисовку окна внутри клиентской области другого дочернего окна.

положение окна видео

Чтобы задать позицию видео относительно клиентской области окна приложения, вызовите метод IVideoWindow::SetWindowPosition. Этот метод принимает прямоугольник, указывающий левый край, верхний край, ширину и высоту окна видео. Например, следующий код растягивает окно видео, чтобы соответствовать всей клиентской области родительского окна:

RECT rc;
GetClientRect(hwnd, &rc);
pVidWin->SetWindowPosition(0, 0, rc.right, rc.bottom);

Чтобы получить собственный размер видео, вызовите метод IBasicVideo::GetVideoSize в диспетчере графов фильтров. Эти сведения можно использовать для масштабирования видео и поддержания правильного пропорционирования.

Обработка сообщений WM_MOVE

Для обеспечения оптимальной производительности следует уведомлять отрисовщик видео всякий раз, когда окно перемещается во время приостановки графа. Вызовите метод IVideoWindow::NotifyOwnerMessage для пересылки сообщения WM_MOVE:

// (Inside your WindowProc)
case WM_MOVE:
    pVidWin->NotifyOwnerMessage((OAHWND)hWnd, msg, wParam, lParam);
    break;

Если отрисовщик использует аппаратное наложение, это уведомление заставляет отрисовщик обновить положение наложения. (VmR-9 не использует наложения, поэтому не нужно вызывать этот метод, если вы используете VMR-9.)

очистка

Перед завершением работы приложения остановите граф и сбросьте владельца окна видео, чтобы NULL. В противном случае сообщения окна могут быть отправлены в неправильное окно, что, скорее всего, приведет к ошибкам. Кроме того, если не скрыть окно видео, вы можете увидеть, как изображение видео на мгновение мерцает на экране.

pControl->Stop(); 
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);  

Заметка

Если родительский элемент окна видео является дочерним элементом основного окна приложения (иными словами, если окно видео является дочерним), необходимо создать видео окно с помощью CoCreateInstance и добавить его в граф, а не разрешить диспетчеру фильтров добавить отрисовщик видео во время Intelligent Connect. Это гарантирует, что окно видео и дочернее окно перерисовываются одновременно. В противном случае дочернее окно может закрасить окно видео.

 

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