VideoStream in Godot – Complete Guide

Delving into the world of game development can open a myriad of fascinating doors, and nothing brings a game to life quite like a well-placed video. Whether it’s a cinematic opening, a transition between scenes, or an in-game video on a virtual billboard, video streams have an irreplaceable role. This is where Godot 4 comes into play, offering a rich set of tools including the VideoStream class that we’re focusing on today. So, if you’re ready to spice up your game development skills with some video magic, read on!

What is VideoStream?

VideoStream is a base resource in Godot 4 that acts as the foundation for video playback within games. This class serves as a cornerstone for different types of video streams, making it a versatile tool in a developer’s toolkit.

What is it for?

The primary use of the VideoStream class in Godot 4 is to manage video data. It allows developers to integrate video files into their games, control playback, and enhance the player’s visual experience with dynamic content.

Why Should I Learn It?

Understanding how to work with VideoStream is crucial for creating interactive and immersive game experiences. If you aspire to captivate and engage your audience, mastering this class will greatly benefit your game development endeavors.

CTA Small Image

Creating a VideoStream Player

To start using videos in your Godot 4 projects, the first step is to create a VideoPlayer node. Here’s how to do it from the editor:

  1. Open your scene in Godot 4.
  2. Click on the “+ Node” button to add a new node.
  3. Search for “VideoPlayer” and add it to your scene.

Alternatively, you can add a VideoPlayer node using GDScript:

var video_player =

Setting Up a VideoStream

Once you have a VideoPlayer node, you need to assign a VideoStream to it. We’ll start by using a VideoStreamTheora, which supports the .ogv format:

var video_stream =
video_stream.set_file("res://path/to/your/video.ogv") = video_stream

Ensure your video file is in the “res://” directory and replace “path/to/your/video.ogv” with the correct path to your video file.

Controlling Video Playback

Once your VideoStream is set up, you can control playback using GDScript:

# To play the video

# To pause the video

# To stop the video, which also resets playback to the start

Controlling playback programmatically allows for more dynamic and responsive actions, such as starting a video after a game event.

Looping and Autoplay

You may want the video to loop continuously or to start playing automatically when the scene loads. Here’s how to set up these options:

# To enable looped playback

# To autoplay the video when the scene starts

With looping enabled, the video will start over immediately after finishing, and with autoplay enabled, the video starts playing as soon as the node is ready.

Adjusting Video Player Properties

Finally, you can adjust various properties of the VideoPlayer node, like its volume and whether it expands to fit the node’s size:

# To set the volume (0.0 for mute, and 1.0 for full volume)
video_player.set_volume_db(0.0)  # Mute
video_player.set_volume_db(-10.0)  # Lower volume
video_player.set_volume_db(0.0)  # Full volume

# To make the video expand to fit the video player's size

To further refine the control you have over video playback in Godot, let’s look at some ways you can interact with the VideoStream and VideoPlayer during runtime.

Handling Playback Completion

To execute certain actions when a video finishes playing, you can connect to the “finished” signal of the VideoPlayer node:

video_player.connect("finished", self, "_on_VideoPlayer_finished")

func _on_VideoPlayer_finished():
    print("Video has finished playing")
    # Add additional actions here

This function can trigger a variety of actions such as exiting the VideoPlayer, changing the scene, or starting another video stream.

Video Playback Information

Godot also gives you the ability to access video playback information, like the current position and the total length of the video:

# To get the current playback position in seconds
var current_position = video_player.get_position()

# To get the total video length in seconds
var video_length = video_player.get_stream_length()

Seeking Through Video

If you want to allow players to skip forward or backward through the video, you can use the “seek” function:

# To skip to 10 seconds into the video

# To go to halfway point of the video / 2)

Custom Playback Behavior

For more complex playback controls, like fast forward or rewind, implement the logic within your script:

# Increment to fast forward
var fast_forward_increment = 5.0

func fast_forward():
    var new_position = min(video_player.get_position() + fast_forward_increment, video_player.get_stream_length())

# Decrement to rewind
var rewind_increment = -5.0

func rewind():
    var new_position = max(video_player.get_position() + rewind_increment, 0.0)

This snippet offers simple functions to move the video playback position forward or backward by five seconds.

Adjusting Audio and Video Tracks

With videos that have multiple audio or video tracks, you can select which track to play using the appropriate methods:

# To get the number of audio tracks
var num_audio_tracks = video_player.get_audio_track_count()

# To set the current audio track
video_player.set_audio_track(1)  # Change the track index accordingly

# Similarly, for video tracks
var num_video_tracks = video_player.get_video_track_count()
video_player.set_video_track(1)  # Change the track index accordingly

However, note that support for multiple audio or video tracks is dependent on the format and the specific VideoStream class used.

As you become more familiar with Godot’s VideoPlayer, you’ll find that it’s packed with functions allowing fine-grained control over the video playback experience. Let’s explore additional features and see how we can use code to enhance the player’s interaction with video content in our games.

Syncing Video with Game Events

When you want a game event to trigger a video or vice versa, Godot’s signals become invaluable:

# Connect a custom signal to play a video
self.connect("start_video_event", video_player, "play")

# Emitting this signal elsewhere in your script will start the video

This code snippet demonstrates how to create a custom signal that when emitted, plays a video.

Muting and Unmuting Videos

Providing an option to mute and unmute video can create a better user experience. Here’s how to toggle the audio:

func toggle_mute():
    if video_player.is_playing():
        if video_player.get_volume_db() == 0.0:
            video_player.set_volume_db(-20.0) # Set to preferred volume level
            video_player.set_volume_db(0.0) # Mute the video

This function checks whether the video is currently playing and toggles the volume accordingly.

Adjusting Playback Speed

In some scenarios, you may want to speed up or slow down video playback:

# To double the speed of video playback

# To slow down the video playback to half speed

# Reset to normal speed

Here the playback speed is being adjusted, allowing for slow motion or fast forward effects during video playback.

Displaying Subtitles

Subtitles are an important part of video content. To overlay subtitles, you could use a Label node:

# Assuming you have a Label node named Subtitles
var subtitles = $Subtitles

# Set the subtitle text
subtitles.text = "Your subtitle text here"

This snippet shows how you could set up a subtitles system, with the actual subtitle data coming from a file or another source during runtime.

Integrating Video as a Texture

For more creative applications, you can use a video as a texture on a 3D surface or as a UI element:

# Assuming you have a Sprite node
video_player.connect("frame_changed", self, "_on_frame_changed")

func _on_frame_changed():
    var video_texture = video_player.get_texture()
    $Sprite.texture = video_texture

This script updates a Sprite’s texture with the current video frame whenever it changes, simulating a “screen” displaying the video within your game.

Utilizing Godot’s VideoPlayer effectively is a surefire way to enhance your game’s ambiance and overall user experience. By mastering these features and code examples, you’ll be fully equipped to incorporate video streams into your Godot 4 projects like a pro!

Where to Go Next?

With the foundation you’ve built in using VideoStream in Godot 4, you’re well on your way to enhancing the games you create with rich multimedia experiences. The journey of learning and mastering game development, however, doesn’t end here—it’s a continuous path of exploration and growth.

We at Zenva understand the excitement that comes with game development and the satisfaction of expanding your skill set. That’s why we recommend checking out our Godot Game Development Mini-Degree to continue forging your path in game creation. Our comprehensive program covers a wide range of topics, perfect for honing your expertise in this versatile and powerful game engine, from beginner concepts through to advanced techniques. And if you’re looking to broaden your horizons even further, explore our full collection of Godot courses here.

Whatever your skill level may be — from beginner to developer looking for a refresher — we have a spot for you at Zenva. Our courses are designed to be flexible, thorough, and hands-on. Always remember, learning is a journey, not a destination, and we can’t wait to accompany you through the next steps of yours!


Powering through Godot 4’s VideoStream capabilities is like unlocking a new realm of creative expression in game development. It’s a testament to the boundless nature of this craft, where even the sky isn’t a limit. Whether it’s to deepen storytelling, embellish gameplay, or just add a dash of cinematic flair, your newfound skills are a game-changer.

Remember, every game you create is a unique canvas for your imagination. So keep experimenting, keep learning, and keep pushing boundaries. Ready for the next level? Dive deeper into Godot’s rich landscape with our Godot Game Development Mini-Degree. Let’s turn your game development dreams into reality, one frame at a time!

Python Blog Image

FINAL DAYS: Unlock coding courses in Unity, Godot, Unreal, Python and more.