Uso del modo con ventanas
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Nota:
El filtro del representador de vídeo heredado siempre usa el modo con ventanas. Los filtros VMR-7 y VMR-9 usan el modo de ventana de forma predeterminada, pero también admiten el modo sin ventanas.
En el modo con ventana, el representador de vídeo crea su propia ventana donde pinta los fotogramas de vídeo. A menos que especifique lo contrario, esta ventana es una ventana de nivel superior con sus propios bordes y barra de título. Sin embargo, la mayoría de las veces asociará la ventana de vídeo a una ventana de aplicación, de modo que el vídeo esté integrado en la interfaz de usuario de la aplicación. Para ello, siga estos pasos:
- Consulta para IVideoWindow.
- Establezca la ventana primaria.
- Establecer nuevos estilos de ventana.
- Coloque la ventana de vídeo dentro de la ventana del propietario.
- Notificar a la ventana de vídeo los mensajes de WM_MOVE.
Consulta de IVideoWindow
Antes de iniciar la reproducción, consulte el Administrador de gráficos de filtros para la interfaz IVideoWindow :
IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
Establecer la ventana primaria
Para establecer la ventana primaria, llame al método IVideoWindow::p ut_Owner con un identificador a la ventana de la aplicación. Este método toma una variable de tipo OAHWND, por lo que convierte el identificador en este tipo:
pVidWin->put_Owner((OAHWND)hwnd);
Establecer nuevos estilos de ventana
Cambie el estilo de la ventana de vídeo llamando al método IVideoWindow::p ut_WindowStyle :
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
La marca WS_CHILD establece la ventana como una ventana secundaria y la marca WS_CLIPSIBLINGS impide que la ventana se dibuse dentro del área cliente de otra ventana secundaria.
Colocar la ventana de vídeo
Para establecer la posición del vídeo en relación con el área cliente de la ventana de la aplicación, llame al método IVideoWindow::SetWindowPosition . Este método toma un rectángulo que especifica el borde izquierdo, el borde superior, el ancho y el alto de la ventana de vídeo. Por ejemplo, el código siguiente amplía la ventana de vídeo para ajustarse a todo el área de cliente de la ventana primaria:
RECT rc;
GetClientRect(hwnd, &rc);
pVidWin->SetWindowPosition(0, 0, rc.right, rc.bottom);
Para obtener el tamaño nativo del vídeo, llame al método IBasicVideo::GetVideoSize en el Administrador de gráficos de filtros. Puede usar esa información para escalar el vídeo y mantener la relación de aspecto correcta.
Responder a mensajes de WM_MOVE
Para obtener el mejor rendimiento, debe notificar al representador de vídeo cada vez que la ventana se mueve mientras el gráfico está en pausa. Llame al método IVideoWindow::NotifyOwnerMessage para reenviar el mensaje WM_MOVE:
// (Inside your WindowProc)
case WM_MOVE:
pVidWin->NotifyOwnerMessage((OAHWND)hWnd, msg, wParam, lParam);
break;
Si el representador usa una superposición de hardware, esta notificación hace que el representador actualice la posición de superposición. (VMR-9 no usa superposiciones, por lo que no es necesario llamar a este método si usa VMR-9).
Limpieza
Antes de que se cierre la aplicación, detenga el gráfico y restablezca el propietario de la ventana de vídeo a NULL. De lo contrario, es posible que los mensajes de ventana se envíen a la ventana incorrecta, lo que es probable que cause errores. Además, oculte la ventana de vídeo o, de lo contrario, podría ver un parpadeo de imagen de vídeo en la pantalla momentáneamente:
pControl->Stop();
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);
Nota:
Si el elemento primario de la ventana de vídeo es un elemento secundario de la ventana principal de la aplicación (es decir, si la ventana de vídeo es un elemento secundario de un elemento secundario), debe crear la ventana de vídeo con CoCreateInstance y agregarla al gráfico, en lugar de permitir que el Administrador de gráficos de filtros agregue el representador de vídeo durante Intelligent Connect. Esto garantiza que la ventana de vídeo y la ventana secundaria se vuelvan a pintar al mismo tiempo. De lo contrario, la ventana secundaria puede pintar sobre la ventana de vídeo.
Temas relacionados