using System; using System.Collections; using System.Diagnostics.Contracts; using System.IO; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using UnityEngine.Video; using XFramework; public class VideoController : MonoBehaviour, IDragHandler, IPointerClickHandler { [SerializeField] private VideoPlayer videoPlayer; [SerializeField] private Image videoProgress; [SerializeField] private Image playControllerImg; [SerializeField] private Sprite playSprite; [SerializeField] private Sprite pauseSprite; [SerializeField] private Text VideoTotalTime; [SerializeField] private Text VideoNowTime; [SerializeField] private Text VideoNametext; [SerializeField] private Slider audioSlider; public RenderTexture RD; private float videoTimeCount; /// /// 正在使用视频控件事件 /// public event Action videoControlling; /// /// 视频暂停事件 /// public event Action videoPause; private bool isPause; /// /// 当前视频的播放状态 /// /// public bool IsPause { get => isPause; } /// /// 当前要播放视频的名称 /// public string VideoName = string.Empty; public string VideoPath = string.Empty; public GameObject videoPanel; //private void OnEnable() //{ // if (this.VideoPath == string.Empty) // { // Debug.LogError("无效的视频路径"); // VideoNametext.text = "无效的视频路径!"; // return; // } // Init(); //} /// /// 播放视频 /// /// /// public void PlayVideo(string path) { this.gameObject.SetActive(true); if (path == string.Empty) { Debug.LogError("无效的视频路径"); VideoNametext.text = "无效的视频路径!"; return; } this.VideoPath = path; this.VideoName = Path.GetFileName(path); Init(); } private void Start() { if (this.VideoName == string.Empty) return; audioSlider.onValueChanged.AddListener(SetVideoAuido); videoPlayer.loopPointReached += (vd) => { playControllerImg.sprite = pauseSprite; videoPause?.Invoke(); isPause = true; }; videoPlayer.prepareCompleted += (v) => { videoTimeCount = (float) videoPlayer.length; VideoTotalTime.text = ((int) videoTimeCount / 60).ToString("D2") + ":" + ((int) (videoTimeCount) % 60).ToString("D2"); UpdateVideoTimeText(); playControllerImg.sprite = playSprite; }; videoPlayer.Prepare(); } /// /// 对视频信息执行一些初始化 /// private void Init() { videoPlayer.source = VideoSource.Url; videoPlayer.url = VideoPath; VideoNametext.text = VideoName; } /// /// 打开并播放指定视频 /// /// 播放视频的名字,视频放在StreamingAssets下 public void OpenAndPlayByName(string videoname) { //如果为切换视频 // if (this.videoName!=string.Empty&&this.videoName.Equals(videoName)&&videoPanel.activeSelf)Init(); this.VideoName = videoname; videoPanel.gameObject.SetActive(true); } /// /// 关闭当前视频面板,释放视频资源 /// public void CloseVideo() { RD.Release(); RD.DiscardContents(); videoPlayer.Stop(); videoProgress.fillAmount = 0; videoPanel.gameObject.SetActive(false); } /// /// 暂停、播放视频控制 /// public void PlayController() { if (videoPlayer.isPlaying) { videoPlayer.Pause(); isPause = true; playControllerImg.sprite = pauseSprite; videoPause?.Invoke(); } else { videoPlayer.Play(); isPause = false; playControllerImg.sprite = playSprite; videoControlling?.Invoke(); } } private void Update() { if (videoPlayer.frameCount > 0) { UpdateVideoTimeText(); } } //private string LoadVideoByStreamFolder(string videoName) //{ // //string path = "file://" + Application.streamingAssetsPath + "/" + videoName + ".mp4"; // string path = StreamingAssetsManager.GetPath(videoName); // return path; //} /// /// 更新视频的播放时间 /// private void UpdateVideoTimeText() { videoProgress.fillAmount = ((float) videoPlayer.frame / (float) videoPlayer.frameCount); VideoNowTime.text = ((int) videoPlayer.time / 60).ToString("D2") + ":" + ((int) videoPlayer.time % 60).ToString("D2"); } public void OnDrag(PointerEventData eventData) { TrySkip(eventData); } public void OnPointerClick(PointerEventData eventData) { TrySkip(eventData); } private void TrySkip(PointerEventData eventData) { Vector2 localPoint; if (RectTransformUtility.ScreenPointToLocalPointInRectangle(videoProgress.rectTransform, eventData.position, null, out localPoint)) { float pct = Mathf.InverseLerp(videoProgress.rectTransform.rect.xMin, videoProgress.rectTransform.rect.xMax, localPoint.x); SkipToTarget(pct); } } private void SkipToTarget(float pct) { var frame = videoPlayer.frameCount * pct; videoPlayer.frame = (long) frame; videoPlayer.Play(); isPause = false; videoControlling?.Invoke(); playControllerImg.sprite = playSprite; } private void SetVideoAuido(float v) { videoControlling?.Invoke(); if (videoPlayer.canSetDirectAudioVolume) { videoPlayer.SetDirectAudioVolume(0, v); } } }