【Unity-学习-009】优化Unity VideoPlayer

Unity的VideoPlayer在使用过程中,经常出现各种各样的BUG。在使用过程中,出现了视频衔接黑屏的现象,发布之后,播放黑屏等问题。经过优化后,有了我现在用的播放视频的脚本。 

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class MyVCR : MonoBehaviour
{
    public enum FileLocationType
    {
        DataPath, StreamingAssets, Resources, URL
    }

    private double videoLength = 0;

    [SerializeField]
    private VideoPlayer playerA;
    [SerializeField]
    private VideoPlayer playerB;
    [SerializeField]
    private RenderTexture textureA;
    [SerializeField]
    private RenderTexture textureB;
    [SerializeField]
    private RawImage RawImage;

    private RenderTexture _loadingTexture;
    private VideoPlayer _loadingPlayer;
    private VideoPlayer LoadingPlayer
    {
        get
        {
            return _loadingPlayer;
        }
    }

    private VideoPlayer _playingPlayer;
    private VideoPlayer PlayingPlayer
    {
        get
        {
            if (LoadingPlayer == playerA)
            {
                _playingPlayer = playerB;
            }
            else
            {
                _playingPlayer = playerA;

            }
            videoLength = _playingPlayer.length;
            return _playingPlayer;
        }
    }


    /// <summary>
    /// 初始化
    /// </summary>
    public void Init()
    {
        _loadingPlayer = playerB;

        if (PlayingPlayer)
        {
            PlayingPlayer.prepareCompleted += PlayingPlayer_prepareCompleted;

            if (LoadingPlayer)
            {
                LoadingPlayer.prepareCompleted += PlayingPlayer_prepareCompleted;
            }
        }
        RawImage.texture = PlayingPlayer.targetTexture;
    }

    private void PlayingPlayer_prepareCompleted(VideoPlayer source)
    {
        SwapPlayers();
    }

    /// <summary>
    /// 按文件名打开视频
    /// </summary>
    /// <param name="path"></param>
    public void OnOpenVideoFile(FileLocationType type, string path)
    {
        LoadingPlayer.Stop();
        switch (type)
        {
            case FileLocationType.DataPath:
                LoadingPlayer.url = Application.dataPath + "/" + path + ".mp4";
                break;
            case FileLocationType.StreamingAssets:
                LoadingPlayer.url = Application.streamingAssetsPath + "/" + path + ".mp4";
                break;
            case FileLocationType.Resources:
                LoadingPlayer.clip = Resources.Load<VideoClip>(path + ".mp4");
                break;
            case FileLocationType.URL:
                LoadingPlayer.url = path;
                break;
        }
        videoLength = LoadingPlayer.length;

        PlayVidoe();
    }

    /// <summary>
    /// 按 clip 打开视频
    /// </summary>
    /// <param name="clip"></param>
    public void OnOpenVideoFile(VideoClip clip)
    {
        LoadingPlayer.clip = clip;
        PlayVidoe();
    }

    private void PlayVidoe()
    {
        PlayingPlayer.Play();
    }


    /// <summary>
    /// 交换player
    /// </summary>
    private void SwapPlayers()
    {
        PlayingPlayer.Pause();
        PlayingPlayer.targetTexture.Release();
        if (LoadingPlayer == playerA)
        {
            _loadingPlayer = playerB;
        }
        else
        {
            _loadingPlayer = playerA;
        }
        RawImage.texture = PlayingPlayer.targetTexture;
    }


    /// <summary>
    /// 播放
    /// </summary>
    public void Play()
    {
        if (PlayingPlayer.isPlaying == false)
        {
            PlayingPlayer.Play();
        }
    }

    /// <summary>
    /// 暂停
    /// </summary>
    public void Pause()
    {
        if (PlayingPlayer.isPlaying)
        {
            PlayingPlayer.Pause();
        }
    }

    /// <summary>
    /// 停止
    /// </summary>
    public void Stop()
    {
        PlayingPlayer.Stop();
    }


    public void Next(double length)
    {
        if (PlayingPlayer.isPlaying)
        {
            double l = PlayingPlayer.time;
            l += length;
            if (l > videoLength)
            {
                PlayingPlayer.time = videoLength;
            }
            else
            {
                PlayingPlayer.time += length;
            }
        }
    }
    public void Prev(double length)
    {
        if (PlayingPlayer.isPlaying)
        {
            double l = PlayingPlayer.time;
            l -= length;
            if (l < 0)
            {
                PlayingPlayer.time = 0;
            }
            else
            {
                PlayingPlayer.time -= length;
            }
        }
    }

}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThursdayGame

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值