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);
}
}
}