Unity播放网络视频

阅读 25

2023-12-16

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using Mx.UI;
 using Mx.Utils;
 using UnityEngine.UI;
 using UnityEngine.Video;/// <summary> 视频UI面板 </summary>
 public class VideoUIForm : BaseUIForm
 {
     private ImageAdaptive imageAdaptive;
     private RawImage rawImage;
     private VideoPlayer videoPlayer;
     private bool isPlaying = false;
     private Slider slider;
     private Text playTimeText;
     private Text lengthText;
     private GameObject playButtonGo;
     private GameObject playIconGo;
     private GameObject pauseIconGo;
     private bool sliderIsDrag = false;    private float playTime;
     private float length;    public override void OnAwake()
     {
         base.OnAwake();        init();
        rigisterButtonEvent();
     }    private void init()
     {
         slider = UnityHelper.FindTheChildNode(gameObject, "Slider").GetComponent<Slider>();
         rawImage = UnityHelper.FindTheChildNode(gameObject, "Stage").GetComponent<RawImage>();
         rawImage.enabled = false;
         videoPlayer = rawImage.gameObject.GetComponent<VideoPlayer>();
         if (videoPlayer == null) videoPlayer = rawImage.gameObject.AddComponent<VideoPlayer>();
         playTimeText = UnityHelper.FindTheChildNode(gameObject, "PlayTime").GetComponent<Text>();
         lengthText = UnityHelper.FindTheChildNode(gameObject, "Length").GetComponent<Text>();
         playButtonGo = UnityHelper.FindTheChildNode(gameObject, "BtnPlay").gameObject;
         playIconGo = UnityHelper.FindTheChildNode(gameObject, "PlayIcon").gameObject;
         pauseIconGo = UnityHelper.FindTheChildNode(gameObject, "PauseIcon").gameObject;        imageAdaptive = rawImage.GetComponent<ImageAdaptive>();
         if (imageAdaptive == null) imageAdaptive = rawImage.gameObject.AddComponent<ImageAdaptive>();        videoPlayer.playOnAwake = false; // 设置不自动播放
         videoPlayer.waitForFirstFrame = true; // 等待第一帧加载完成再显示
         videoPlayer.source = VideoSource.Url;
         videoPlayer.aspectRatio = VideoAspectRatio.FitVertically;        videoPlayer.prepareCompleted += onVideoPrepared; // 视频加载完成事件
         videoPlayer.loopPointReached += onVideoEnd; // 视频播放完成事件        playIconGo.SetActive(true);
         pauseIconGo.SetActive(false);        initFinish = true;
     }    void Update()
     {
         if (!sliderIsDrag)
         {
             float progress = (float)videoPlayer.time / (float)videoPlayer.length;
             if (progress > 0) slider.value = progress;
             length = (float)videoPlayer.length;
             lengthText.text = formatTime(length);
         }        playTime = (float)videoPlayer.time;
         playTimeText.text = formatTime(playTime);
         playButtonGo.SetActive(!isPlaying);
         playIconGo.SetActive(!isPlaying);
         pauseIconGo.SetActive(isPlaying);
     }    /// <summary>关闭UI窗口事件</summary>
     public override void OnCloseUIEvent()
     {
         base.OnCloseUIEvent();        clearData();
     }    public override void OnUIMsgEvent(string key, object values)
     {
         base.OnUIMsgEvent(key, values);        switch (key)
         {
             case MsgDefine.UPDATE_PANEL_DATA:
                 if (values != null)
                 {
                     if (initFinish)
                     {
                         rawImage.enabled = false;                        string path = (string)values;
                         string encodedUrl = System.Uri.EscapeUriString(path);
                         videoPlayer.url = encodedUrl;
                         videoPlayer.Play();
                         isPlaying = true;                    }
                 }
                 break;
         }    }
    /// <summary>注册按钮事件</summary>
     private void rigisterButtonEvent()
     {
         RigisterButtonEvent("BtnClose", (clickObj) => { CloseCurrentUIForm(); });
         RigisterButtonEvent("BtnPlayAndPause", (clickObj) => { PlayPauseVideo(); });
         RigisterButtonEvent("BtnPlay", (clickObj) =>
         {
             videoPlayer.Play();
             isPlaying = true;
         });
     }    /// <summary>进度条拖动发送改变</summary>
     public void OnSliderDragChange(bool isDrag)
     {
         sliderIsDrag = isDrag;
     }    /// <summary>清理数据</summary>
     private void clearData()
     {
         if (!initFinish) return;        isPlaying = false;
         slider.value = 0;
         playTimeText.text = "00:00";
         lengthText.text = "00:00";
         playButtonGo.SetActive(true);
         playIconGo.SetActive(true);
         pauseIconGo.SetActive(false);
         sliderIsDrag = false;
     }    /// <summary>视频准备完成</summary>
     private void onVideoPrepared(VideoPlayer source)
     {
         rawImage.texture = source.texture;
         source.Play();
         rawImage.enabled = true;
         isPlaying = true;        // 获取视频的宽度和高度
         uint width = source.width;
         uint height = source.height;        RectTransform parentRect = transform.parent.GetComponent<RectTransform>();
         if (parentRect != null)
         {
             imageAdaptive.BoundarySize = new Vector2(parentRect.rect.width, parentRect.rect.height);
             imageAdaptive.ImageSize = new Vector2(width, height);
         }    }
    /// <summary>视频播放结束</summary>
     private void onVideoEnd(VideoPlayer source)
     {
         source.Pause();
         isPlaying = false;
     }    /// <summary>播放或者暂停视频</summary>
     public void PlayPauseVideo()
     {
         if (isPlaying)
         {
             videoPlayer.Pause();
             isPlaying = false;
         }
         else
         {
             videoPlayer.Play();
             isPlaying = true;
         }
     }    /// <summary>设置视频播放进度</summary>
     public void setVideoProgress(float progress)
     {
         if (videoPlayer.canSetTime)
         {
             videoPlayer.time = videoPlayer.clip.length * progress;
         }
     }    /// <summary>格式化时间</summary>
     private string formatTime(float time)
     {
         int minutes = Mathf.FloorToInt(time / 60f);
         int seconds = Mathf.FloorToInt(time % 60f);        return string.Format("{0:00}:{1:00}", minutes, seconds);
     }
 }

精彩评论(0)

0 0 举报