Using new Unity VideoPlayer and VideoClip API to play video

后端 未结 4 2229
栀梦
栀梦 2020-11-22 01:50

MovieTexture is finally deprecated after Unity 5.6.0b1 release and new API that plays video on both Desktop and Mobile devices is now released.

VideoPlayer and Video

相关标签:
4条回答
  • 2020-11-22 02:08

    Found the problem. Below is the FIXED code that plays Video and Audio:

    //Raw Image to Show Video Images [Assign from the Editor]
    public RawImage image;
    //Video To Play [Assign from the Editor]
    public VideoClip videoToPlay;
    
    private VideoPlayer videoPlayer;
    private VideoSource videoSource;
    
    //Audio
    private AudioSource audioSource;
    
    // Use this for initialization
    void Start()
    {
        Application.runInBackground = true;
        StartCoroutine(playVideo());
    }
    
    IEnumerator playVideo()
    {
        //Add VideoPlayer to the GameObject
        videoPlayer = gameObject.AddComponent<VideoPlayer>();
    
        //Add AudioSource
        audioSource = gameObject.AddComponent<AudioSource>();
    
        //Disable Play on Awake for both Video and Audio
        videoPlayer.playOnAwake = false;
        audioSource.playOnAwake = false;
    
        //We want to play from video clip not from url
        videoPlayer.source = VideoSource.VideoClip;
    
        //Set Audio Output to AudioSource
        videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
    
        //Assign the Audio from Video to AudioSource to be played
        videoPlayer.EnableAudioTrack(0, true);
        videoPlayer.SetTargetAudioSource(0, audioSource);
    
        //Set video To Play then prepare Audio to prevent Buffering
        videoPlayer.clip = videoToPlay;
        videoPlayer.Prepare();
    
        //Wait until video is prepared
        while (!videoPlayer.isPrepared)
        {
            Debug.Log("Preparing Video");
            yield return null;
        }
    
        Debug.Log("Done Preparing Video");
    
        //Assign the Texture from Video to RawImage to be displayed
        image.texture = videoPlayer.texture;
    
        //Play Video
        videoPlayer.Play();
    
        //Play Sound
        audioSource.Play();
    
        Debug.Log("Playing Video");
        while (videoPlayer.isPlaying)
        {
            Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time));
            yield return null;
        }
    
        Debug.Log("Done Playing Video");
    }
    

    Why Audio was not playing:

    //Set Audio Output to AudioSource
    videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
    
    //Assign the Audio from Video to AudioSource to be played
    videoPlayer.EnableAudioTrack(0, true);
    videoPlayer.SetTargetAudioSource(0, audioSource);
    

    must be called before videoPlayer.Prepare(); not after it. This is took hours of experiment to find this this was the problem I was having.


    Stuck at "Preparing Video"?

    Wait 5 seconds after videoPlayer.Prepare(); is called then exit the while loop.

    Replace:

    while (!videoPlayer.isPrepared)
    {
        Debug.Log("Preparing Video");
        yield return null;
    }
    

    with:

    //Wait until video is prepared
    WaitForSeconds waitTime = new WaitForSeconds(5);
    while (!videoPlayer.isPrepared)
    {
        Debug.Log("Preparing Video");
        //Prepare/Wait for 5 sceonds only
        yield return waitTime;
        //Break out of the while loop after 5 seconds wait
        break;
    }
    

    This should work but you may experience buffering when the video starts playing. While using this temporary fix, my suggestion is to file for bug with the title of "videoPlayer.isPrepared always true" because this is a bug.

    Some people also fixed it by changing:

    videoPlayer.playOnAwake = false; 
    audioSource.playOnAwake = false;
    

    to

    videoPlayer.playOnAwake = true; 
    audioSource.playOnAwake = true;
    

    Play Video From URL:

    Replace:

    //We want to play from video clip not from url
    videoPlayer.source = VideoSource.VideoClip;
    

    with:

    //We want to play from url
    videoPlayer.source = VideoSource.Url;
    videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";
    

    then Remove:

    public VideoClip videoToPlay; and videoPlayer.clip = videoToPlay; as these are not needed anymore.

    Play Video From StreamingAssets folder:

    string url = "file://" + Application.streamingAssetsPath + "/" + "VideoName.mp4";
    
    if !UNITY_EDITOR && UNITY_ANDROID
        url = Application.streamingAssetsPath + "/" + "VideoName.mp4";
    #endif
    
    //We want to play from url
    videoPlayer.source = VideoSource.Url;
    videoPlayer.url = url;
    

    All supported video formats:

    • ogv
    • vp8
    • webm
    • mov
    • dv
    • mp4
    • m4v
    • mpg
    • mpeg

    Extra supported video formats on Windows:

    • avi
    • asf
    • wmf

    Some of these formats don't work on some platforms. See this post for more information on supported video formats.

    0 讨论(0)
  • 2020-11-22 02:17

    Similar to what the other answers have been saying. You could use callbacks for when preparing and end of video states. Rather than using coroutines and yield return.

    videoPlayer.loopPointReached += EndReached;
    videoPlayer.prepareCompleted += PrepareCompleted;
    
    void PrepareCompleted(VideoPlayer vp) {
        vp.Play();
    }
    
    void EndReached(VideoPlayer vp) {
        // do something
    }
    
    0 讨论(0)
  • 2020-11-22 02:19

    I used @Programmer 's answer to play videos from a URL, but I couldn't get any sound to play. Eventually I found the answer in the comments of a YouTube tutorial.

    To get the audio to play for a movie loaded via URL, you need to add the following line before the call to EnableAudioTrack:

    videoPlayer.controlledAudioTrackCount = 1;
    
    0 讨论(0)
  • 2020-11-22 02:24

    By now the VideoPlayer should be updated enough you don't need to write code to get to work correctly. Here are the settings I found to have the most desirable effect:

    These settings are:

    Video Player:

    • Play On Awake: True
    • Wait For First Frame: False
    • Audio Output Mode: None

    Audio Source:

    • Play On Awake: True

    Don't forget to have a VideoClip for the VideoPlayer and an AudioClip for the AudioSource. The file formats I found to work the best are .ogv for video and .wav for audio.

    0 讨论(0)
提交回复
热议问题