Information
The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.

Playing a Video on a Surface

Demonstrates how to use the VideoPlayer to play back videos on the surface of a quad.

Complete Sample

The code in this topic shows you the technique for playing a video on a quad's surface. You can download a complete code sample for this topic, including full source code and any additional supporting files required by the sample.

Playing Video

To play a video

  1. Create a quad (or other 2D or 3D surface) on which to display the video.

  2. Create a View and Projection matrix for viewing the quad.

    protected override void Initialize()
    {
        // Create a scene, including a quad and a view matrix looking at it
        quad = new Quad(Vector3.Zero, Vector3.Backward, Vector3.Up, 1, 1);
        viewMatrix = Matrix.CreateLookAt(new Vector3(0, 0, 2),
            Vector3.Zero, Vector3.Up);
        projectionMatrix = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.PiOver4, 4.0f / 3.0f, 1, 500);
    
        base.Initialize();
    }
    
  3. Add a video to the game project using the steps outlined in loading resources.
  4. In LoadContent, use the ContentManager to load the video.
  5. Create a new instance of the VideoPlayer.

    Dd904199.note(en-us,XNAGameStudio.41).gifTip

    Set IsLooped to true if you want the video to repeat.

  6. Set up your Effect for drawing.

    Dd904199.note(en-us,XNAGameStudio.41).gifNote

    In this case, we use BasicEffect, enabling default lighting and a texture.

    protected override void LoadContent()
    {
        // Load a video, and initialize a player
        video = Content.Load<Video>("video");
        player = new VideoPlayer();
        player.IsLooped = true;
    
        // Setup our BasicEffect for drawing the quad
        worldMatrix = Matrix.CreateScale(video.Width / (float)video.Height, 1, 1);
        basicEffect = new BasicEffect(graphics.GraphicsDevice);
        basicEffect.EnableDefaultLighting();
        basicEffect.World = worldMatrix;
        basicEffect.View = viewMatrix;
        basicEffect.Projection = projectionMatrix;
        basicEffect.TextureEnabled = true;
    
        // Create a vertex declaration
        vertexDeclaration = new VertexDeclaration(
            new VertexElement[] {
                new VertexElement(0, VertexElementFormat.Vector3,VertexElementUsage.Position, 0),
                new VertexElement(12, VertexElementFormat.Vector3,VertexElementUsage.Normal, 0),
                new VertexElement(24, VertexElementFormat.Vector2,VertexElementUsage.TextureCoordinate,0) 
            }
            );
    }
    
  7. In the Update method, play the video.

    protected override void Update(GameTime gameTime)
    {
        ...
        // Play the video if it isn't already.
        if (player.State != MediaState.Playing)
            player.Play(video);
    
        base.Update(gameTime);
    }
    
  8. In Draw, if the VideoPlayer is not stopped, call GetTexture to get a copy of the latest frame of video, and link it to your effect.
  9. Draw the object using your effect.

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
    
        // If the video is playing, get the current frame
        // as a texture. (Calling GetTexture on a stopped
        // player results in an exception)
        if (player.State == MediaState.Playing)
            basicEffect.Texture = player.GetTexture();
    
        // Draw the quad
        foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)
        {
            pass.Apply();
    
            GraphicsDevice.DrawUserIndexedPrimitives
                <VertexPositionNormalTexture>(
                    PrimitiveType.TriangleList,
                    quad.Vertices, 0, 4,
                    quad.Indexes, 0, 2);
        }
    
        base.Draw(gameTime);
    }
    

Community Additions

Show:
© 2014 Microsoft