[XNA] Reproducción de vídeo en XNA 3.1

La reproducción de vídeo es una de las novedades de XNA 3.1. La verdad es que me ha sorprendido lo fácil que resulta su implementación… me ha dado más problemas el formato wmv que la própia codificación. Al añadir un wmv al Content y compilar, aparecía el error siguiente: “Please make sure that the video is not DRM protected and is a valid single-pass CBR encoded video file”. Para solucionar el problema, he bajado el Windows Media Encoder (descarga gratuita). Entre otras cosas, este programa permite convertir un vídeo a formato WMV, o cambiar el formato de un WMV existente.

Esta es la configuración con la que deberemos generar nuestros vídeos WMV:

 

Para reproducir el vídeo, usaremos las nuevas clases Video y VideoPlayer. ¿El nombre de las clases es evidente? Más lo es su uso… La inicialización del vídeo se hace como la de cualquier otro contenido del Pipeline:

video = Content.Load<Video>(@”test”);

Cambiar el estado del vídeo es igualmente sencillo:

if (Keyboard.GetState().IsKeyDown(Keys.P))
{
                reproductor.Play(video);
}

if (Keyboard.GetState().IsKeyDown(Keys.S))
{
                reproductor.Pause();
}

 

Para “pintar” el vídeo… con el siguiente código en el método Draw quedaría hecho:

protected override void Draw(GameTime gameTime)
{
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();

            spriteBatch.DrawString(fuente, “Pulsa P para reproducir, y S para pausar”, new Vector2(0, 0), Color.White);

            if (reproductor.State == MediaState.Playing || reproductor.State == MediaState.Paused)
            {
                spriteBatch.Draw(reproductor.GetTexture(), new Rectangle(0, 30, video.Width, video.Height), Color.White);
            }

            spriteBatch.End();

            base.Draw(gameTime);
        }
}

El resultado, ejecutando el ejemplo adjunto, sería este:

 

Editado:

Aquí el compañero Tyler me ha enviado un código de como encapsular el vídeo en primitivas geométricas. El código vale realmente la pena, no se encuentra mucha información al respecto en internet. El resultado de la ejecución es el siguiente:

El código de esta pequeña maravilla podéis descargarlo en este enlace.

4 comentarios en “[XNA] Reproducción de vídeo en XNA 3.1”

  1. Buen ejemplo, no tenia ni idea…!!
    A voz de pronto 🙂 se me ocurre si podría reproducirse como textura sobre una primitiva y no en un rectangle… tengo que probar-lo, a ver quando tengo un ratito.

    Saludos!!

  2. Hola, he visto el ejemplo de Tyler y es fantastico, buen trabajo, la única duda que me queda es por qué no se adapta el 100% al plano sino que pinta la parte de abajo del video por detrás del plano. ¿por qué ocurre eso y como podría solucionarse?

    Gracias!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *