# frameReady

> The VideoPlayer invokes this event when a new frame is ready to be displayed.

## Definition

* **Type:** Event
* **Namespace:** [UnityEngine.Video](/engine/6000.7/script-reference/unityengine/video.md)
* **Assembly:** UnityEngine.VideoModule

```csharp
public event VideoPlayer.FrameReadyEventHandler frameReady
```

### Remarks

Use this event to:

* Analyze certain frames of a video.

* Track progress of the video.

* Play other effects such as animations or sound effects at a certain frame.

To enable this event so that the VideoPlayer emits it, set the [\_sendFrameReadyEvents](/engine/6000.7/script-reference/unityengine/video/videoplayer/sendframereadyevents.md) property to `true`. This event is likely to tax the CPU, so set [\_sendFrameReadyEvents](/engine/6000.7/script-reference/unityengine/video/videoplayer/sendframereadyevents.md) back to `false` when you don’t need it.

The VideoPlayer also emits this event if you call [VideoPlayer.Pause](/engine/6000.7/script-reference/unityengine/video/videoplayer/pause.md) on a VideoPlayer that's not prepared yet or isn’t currently playing. When you call `Pause()` on a VideoPlayer that's not prepared or playing, it behaves as if you called `Play()` and then immediately called `Pause()`. This allows you to seek to a certain point in the video, and pause to give it time to prepare the frame before you play it.

### Examples

```csharp
 // This script plays some audio when the VideoPlayer reaches the frame ( targetFrame ) you set.  
 // Make sure to assign a VideoPlayer component to your GameObject and assign an AudioSource in the Inspector. 

using UnityEngine;
using UnityEngine.UIElements;
using UnityEngine.Video;

public class FrameReadyExample : MonoBehaviour
{
    VideoPlayer videoPlayer;
    public AudioSource audioSource;

    // The frame you want to play the sound at (set this value in the Inspector). 
    public int targetFrame;

    void Start()
    {
        videoPlayer = GetComponent<VideoPlayer>();

        if (videoPlayer != null)
        {
            // Prepare the VideoPlayer to play the video. 
            videoPlayer.prepareCompleted += OnPrepareCompleted;
            videoPlayer.Prepare();
        }
        else
            Debug.LogWarning("Your GameObject doesn't have a VideoPlayer component.");
    }

    void OnPrepareCompleted(VideoPlayer vp)
    {
        // Clamp targetFrame to be within the frame count of the video. 
        var totalFrames = videoPlayer.frameCount; 
        targetFrame = Mathf.Clamp(targetFrame, 0, (int)totalFrames - 1);

        videoPlayer.sendFrameReadyEvents = true;
        // When frameReady event is invoked, call this function. 
        videoPlayer.frameReady += OnFrameReady;

        videoPlayer.Play(); 
    }

    void OnFrameReady(VideoPlayer vp, long frameToPlay)
    {
        Debug.Log("Frame " + frameToPlay + " is ready.");

        // Play the audio when the VideoPlayer video reaches the target frame.
        if (frameToPlay == targetFrame)
        {
            if (audioSource != null)
            {
                audioSource.Play();
            }
            else
                Debug.LogWarning("AudioSource component is missing."); 

            videoPlayer.sendFrameReadyEvents = false;
        }
    }
}
```
