Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Video e Imagen juntas?

Iniciado por AuGuS666, 10 de Diciembre de 2008, 09:28:10 PM

« anterior - próximo »

AuGuS666

Hola  :):
Desde hace un par de semanas atras que estoy probando esta gran libreria y me parece bastante interesante, hasta el momento he tropezado con varios problemas que mediante practica y viendo la documentacion pude subsanar, hasta que no se me ocurre nada en este  ???.

Resulta que quisiera mezclar tanto video como imagenes en la pantalla y lo logre:



En la imagen pueden ver que arriba a la izquierda el video se reproduce correctamente, abajo a la izquierda cambio el texto según la posición actual del video que se reproduce y en el medio el tutorial 4 funciona a la perfección rotando y desvaneciendose.

Ahora el problema se da cuando quiero que la ejecución sea en pantalla completa, cuando lo configuro de la siguiente manera:


Call m_Input.Init(Me.hWnd)
Call m_gfx.Init(me.hWnd, 800, 600, 16, false, False, False, 0)
Call m_Video.Init(me.hWnd)


Lo único que se muestra en pantalla es el tutorial 4 con las cuadros rotando, de fondo se escucha la musica del video pero este no se ve por ninguna parte.
Ya que constantemente estoy repintando la pantalla para mostrar a los cuadros y reescribiendo el texto me da la impresión que tambien repinto por encima del lugar donde esta el video por lo tanto este desaparece (aunque si se lo escucha), pero si esto pasa en pantalla completa porque no en ventana?, pues ni idea la diferencia debe ser grande para que suceda en un lado y en otro no.

A la fecha intente varias cosas como darle al video otro hWnd pero lo unico que resulta es: no pintar la pantalla principal con este codigo:


Call m_gfx.DRAW_Map(Backg, 0, 0, 150, m_gfx.Screen.Width, m_gfx.Screen.Height)
Call m_gfx.DRAW_MapEx(Sprite, 128, 240, 150, 128, 128, Angle, Blendop_Color, m_gfx.ARGB_Set(Alpha, 255, 255, 255), Mirror_None, Filter_Bilinear, True)
Call m_gfx.DRAW_MapEx(Sprite, 256 + 64, 240, 150, 128, 128, Angle, Blendop_Aditive, &HFFFFFFFF, Mirror_None, Filter_Bilinear, True)
Call m_gfx.DRAW_MapEx(Sprite, 384 + 128, 240, 150, 128, 128, Angle, Blendop_Sustrative, &HFFFFFFFF, Mirror_None, Filter_Bilinear, True)
Call m_gfx.DRAW_Text(Impact, m_Video.VIDEO_GetCurrentPosition & " - " & m_Video.VIDEO_GetDuration, 50, m_gfx.Screen.Height - 50, 0, &HFFFF7700, Align_Left)
Call m_gfx.DRAW_Text(Impact, "Repetición.- " & CStr(Replay), m_gfx.Screen.Width - 350, 10, 150, &HFFFF7700, Align_Left)
Call m_gfx.DRAW_Text(Impact, "Video.- " & CStr(Video), m_gfx.Screen.Width - 350, 50, 150, &HFFFF7700, Align_Left)
Call m_gfx.Frame(0, 60)


De tal forma que solo se ejecute el codigo de ejecución del video que es asi, de rato en rato pregunto si se esta ejecutando el video si este ya termino pues pasa al siguiente:
  With m_Video
     
            If .VIDEO_GetCurrentPosition = .VIDEO_GetDuration Then
                  'para controlar la cantidad de videos que se reprodujeron
                   If Video < UBound(LvStrF) Then
                      Video = Video + 1
                 Else
                      Video = 1
                     'REPETICION #
                      Replay = Replay + 1
               End If
               
                     If .VIDEO_IsPlaying Then Call .VIDEO_Stop
                        .VIDEO_Unload (VideoID)
             'siguiente video
              VideoID = .VIDEO_Load(pPath & "\" & LvStrF(Video))
                   Call .VIDEO_Play(VideoID, 0, 0, 320, 240)
                   Call .VIDEO_SetVolume(30)
               
        End If
 
End With


Me quede sin ideas  :-\ asi que agradeceria 1 mano en esta cuestion, de preferencia un pequeño ejemplo que mezcle ambos video e imagenes que se repinten todo en pantalla completa.

Gracias de antemano  ;)

Atte AuGuS

[EX3]

Wenas :)

Este problema tiene explicacion pero me temo que no solucion. Me explico. La clase grafica, dx_GFX, funciona sobre Direct3D por lo que usa su propio contexto de video mientras que la clase de video, dx_Video, funciona sobre DirectShow utilizando un contexto de video independiente por secuencia de video ejecutada, en verdad es una ventana contenida en la ventana principal donde se pinta el video, pero esto lo hace DirectShow y no dx_lib32. El tema es que en modo ventana Direct3D usa como contexto la ventana a la que se le referencia por lo que en parte puede interactuar con elementos de otras API's graficas como el GDI de Windows por ejemplo o permitir otras ventanas sobre su contexto, por ejemplo los videos que reproduce a traves de DirectShow. En modo a pantalla completa la cosa cambia. Direct3D toma el control total sobre la pantalla por lo que oculta practicamente todo lo que sea su contexto de video. Por este motivo no se muestran los videos reproducidos con dx_lib32.

En realidad dx_Video se penso para reproducir secuencias de video para introduciones o cinematicas. En modo a pantalla completa, mientras no se llame al metodo Frame() para refrescar el render de dx_GFX, los videos se pueden mostrar sin mas problema (de por si uno de los nuevos tutoriales que traera la version 2.2.0 lo demuestra). El asunto es que no se pueden combinar videos y graficos con dx_lib32 por el asunto de los distintos contextos de video que usan una API y otra dado que la API de DirectShow disponible para Visual Basic 6.0 no permite volcar fotogramas de video sobre una textura como si se puede hacer en la API para C++, que esa hubiera sido la solucion buscada.

Salu2...

P.D.: Hombre, no es una solucion si no mas bien una chapuza. Dado que en modo ventana funciona correctamente el asunto de mezclar video y graficos se me ocurre que se podria forzar el modo pantalla completa en el GDI y no sobre Direct3D mediante unas sencillas llamadas a DirectDraw. Esto haria que el modo de video se pasara a pantalla completa, sin alterar el escritorio ni ningun elemento del mismo, tal y como respeta dx_lib32, y la ventana, sin estilos de borde ni barra de titulo (mediante llamadas a la API de Windows se puede hacer esto ultimo) se podria mostrar en dicho modo de pantalla completa simulado ocupando todo el area de la pantalla. El codigo de DirectDraw es este:
' Añadimos primero la referencia a DirectX7 en la ventana de Referencias del proyecto. El nombre es "DirectX 7 for Visual Basic Type Library".
Option Explicit

Dim dx As New DirectX7 ' Objeto que hace referencia a DirectX.
Dim dd As DirectDraw7 ' Objeto que hace referencia a DirectDraw.

Private Sub Form_Load()
    Set dd = dx.DirectDrawCreate("")
    Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE)
   
    ' En esta linea definimos la resolucion a la que queremos se muestre la ventana: 640x480x 800x600, etc...
    ' Debe ser una resolucion estandar aceptada por la tarjeta de video. En este caso ponemos el formulario
    ' a una resolucion de 800 pixeles de ancho por 600 pixeles de alto a 32 bits de color:
    Call dd.SetDisplayMode(800, 600, 32, 0, DDSDM_DEFAULT)
   
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' Esta llamada devuelve la resolucion al estado anterior:
    Call dd.RestoreDisplayMode
    Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)
End Sub

El codigo para eliminar estilos a la ventana te lo intento pasar mañana por que lo tengo en la maquina del trabajo.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

[EX3]

#2
El codigo para manipular libremente los estilos de la ventana via API' de Windows (el archivo adjunto).

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

AuGuS666

Gracias, lo vere en estos dias y lo comentare  :)...

AuGuS666

 :o Perfecto, y para resumir mas el cambio no fue necesario utilizar el adjunto que colocaste sino solamente cambiar la apariencia del Formulario principal (Appearence = 0 - Flat) y listo todo resulto como resultaba a la fecha pero en pantalla completa.

Gracias por la "chapuza"...  ;)

[EX3]

Me alegro pues :) Lo del adjunto te vendra bien si necesitas que el programa pueda cambiar de modo ventana a pantalla completa, mas que nada para que, como dx_lib32, en modo ventana mantenga la barra de titulo y el borde y en pantalla completa la deje limpia. Si solo vas a ejecutar a pantalla completa oviamente no te es necesario.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.