using System.Collections; using System.Collections.Generic; using UnityEngine; using TMPro; using UnityEngine.UI; using UnityEngine.Video; using DG.Tweening; /// /// 媒体预览 /// public class MediaPreviewPanel : PanelBasic { private RectTransform operation_area; private RectTransform header_area; //交互按钮及文本 private Image audio_preview_panel; private TextMeshProUGUI name_text; private TextMeshProUGUI progress_text; private CustomSlider progress_slider; private Button play_button; private Button stop_button; private Button fast_forward_button; private Button fast_rewind_button; private Button close_button; private Button zoom_button; //音频组件 private AudioSource audio_source; //计时属性 private int currentHour; private int currentMinute; private int currentSecond; private int clipHour; private int clipMinute; private int clipSecond; //图片精灵 public Sprite play_sprite; public Sprite pause_sprite; public Sprite zoom_in_sprite; public Sprite zoom_out_sprite; //视频 private Image video_preview_panel; //private TextMeshProUGUI video_name_text; //private TextMeshProUGUI video_progress_text; //private CustomSlider video_progress_slider; //private Button video_play_button; //private Button video_stop_button; //private Button video_fast_forward_button; //private Button video_fast_rewind_button; //private Button video_close_button; private VideoPlayer video_player; private RectTransform video_player_rect; private CanvasGroup header_area_group; private bool is_video; // Start is called before the first frame update void Start() { video_player_rect = video_player.GetComponent(); header_area_group = header_area.GetComponent(); play_button.onClick.AddListener(OnPlay); stop_button.onClick.AddListener(OnStop); fast_forward_button.onClick.AddListener(OnFastForward); fast_rewind_button.onClick.AddListener(OnFastRewind); progress_slider.onValueStartChanged.AddListener(OnStartDragSlider); progress_slider.onValueChanged.AddListener(OnDragSlider); progress_slider.onValueEndChanged.AddListener(OnEndDragSlider); close_button.onClick.AddListener(OnPreviewPanelClose); zoom_button.onClick.AddListener(OnZoom); //视频播放结束事件 video_player.loopPointReached += Video_player_loopPointReached; } // Update is called once per frame void Update() { UpdateProgress(); } /// /// 播放、暂停 /// void OnPlay() { if (is_video) { if (video_player != null) { if (video_player.isPlaying) { video_player.Pause(); play_button.image.sprite = play_sprite; } else { video_player.Play(); play_button.image.sprite = pause_sprite; } } } else { if (audio_source != null) { if (audio_source.isPlaying) { audio_source.Pause(); play_button.image.sprite = play_sprite; } else { if (audio_source.time == 0)//播放结束后time为0,再次播放时值不是0,强制更新一下 audio_source.time = 0; audio_source.Play(); play_button.image.sprite = pause_sprite; } } } } /// /// 停止播放,进度条重置 /// void OnStop() { if (is_video) { video_player?.Stop(); if (video_player != null) video_player.frame = 0; play_button.image.sprite = play_sprite; } else { audio_source?.Pause(); if (audio_source != null) audio_source.time = 0; play_button.image.sprite = play_sprite; } UpdateProgress(true); } /// /// 快进 默认5s /// void OnFastForward() { if (is_video) { if (video_player != null) { if (video_player.time != 0) video_player.time += 5; else { video_player.Pause(); video_player.time = 5; } } } else { if (audio_source != null) { if (audio_source.time != 0) audio_source.time += 5; else { audio_source.Pause(); audio_source.time = 5; } } } UpdateProgress(true); } /// /// 快退 默认5s /// void OnFastRewind() { if (is_video) { if (video_player != null) { if (video_player.time < 5) video_player.time = 0; else video_player.time -= 5; } } else { if (audio_source != null) { if (audio_source.time < 5) audio_source.time = 0; else audio_source.time -= 5; } } UpdateProgress(true); } /// /// 开始拖拽进度条 /// void OnStartDragSlider() { if (is_video) { video_player?.Pause(); } else { audio_source?.Pause(); } } /// /// 拖拽进度条 /// /// void OnDragSlider(float _value) { if (is_video) { if (video_player != null) video_player.time = _value * video_player.length; } else { if (audio_source != null) audio_source.time = _value * audio_source.clip.length; } } /// /// 结束拖拽进度条 /// void OnEndDragSlider() { if (is_video) { video_player?.Play(); } else { audio_source?.Play(); } } /// /// 关闭预览面板 /// void OnPreviewPanelClose() { if (is_video) { video_player?.Stop(); video_player.targetTexture.Release(); //video_player = null; } else { audio_source?.Stop(); audio_source = null; } OnPopupEnd(); } bool is_zoom_out; public float magnification = 2; public void OnZoom() { is_zoom_out = !is_zoom_out; zoom_button.image.sprite = is_zoom_out ? zoom_in_sprite : zoom_out_sprite; DOTween.To(() => video_player_rect.sizeDelta, (_size) => video_player_rect.sizeDelta = _size, is_zoom_out ? new Vector2(528, 297) * magnification : new Vector2(528, 297), 0.25f); //video_player_rect.sizeDelta = is_zoom_out ? new Vector2(528, 297) * magnification : new Vector2(528, 297); DOTween.To(() => operation_area.anchoredPosition, (_position) => operation_area.anchoredPosition = _position, is_zoom_out ? new Vector2(0, 195) : new Vector2(0, 260), 0.25f); header_area_group.interactable = !is_zoom_out; header_area_group.alpha = is_zoom_out ? 0 : 1; } /// /// 预览音频 /// /// public void PreviewAudio(string _file_name) { //设置状态 is_video = false; audio_preview_panel.gameObject.SetActive(true); video_preview_panel.gameObject.SetActive(false); play_button.image.sprite = pause_sprite; audio_source = MediaPlayer.Instance.audio_source; name_text.text = _file_name; //计算总时间 clipHour = (int)audio_source.clip.length / 3600; clipMinute = (int)(audio_source.clip.length - clipHour * 3600) / 60; clipSecond = (int)(audio_source.clip.length - clipHour * 3600 - clipMinute * 60); audio_source.Play(); //自适应UI位置 header_area.anchoredPosition = new Vector2(0, -411); operation_area.anchoredPosition = new Vector2(0, 420); } /// /// 预览视频 /// /// /// public void PreviewVideo(string _file_name, string _url) { //设置状态 is_video = true; audio_preview_panel.gameObject.SetActive(false); video_preview_panel.gameObject.SetActive(true); play_button.image.sprite = pause_sprite; name_text.text = _file_name; video_player.url = _url; video_player.prepareCompleted += Video_player_prepareCompleted; video_player.Prepare(); //自适应UI位置 header_area.anchoredPosition = new Vector2(0, -245); operation_area.anchoredPosition = new Vector2(0, 260); } private void Video_player_loopPointReached(VideoPlayer source) { //播放完成后重置图标状态 play_button.image.sprite = play_sprite; } private void Video_player_prepareCompleted(VideoPlayer source) { clipHour = (int)video_player.length / 3600; clipMinute = (int)(video_player.length - clipHour * 3600) / 60; clipSecond = (int)(video_player.length - clipHour * 3600 - clipMinute * 60); video_player.Play(); } bool playing; private void UpdateProgress(bool _update_anyway = false) { if (!is_video) { if (_update_anyway || (audio_source != null && audio_source.isPlaying)) { playing = true; //计算当前时间 currentHour = (int)audio_source.time / 3600; currentMinute = (int)(audio_source.time - currentHour * 3600) / 60; currentSecond = (int)(audio_source.time - currentHour * 3600 - currentMinute * 60); progress_text.text = string.Format("{0:D2}:{1:D2}:{2:D2}/{3:D2}:{4:D2}:{5:D2}", currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond); //audio_progress_slider.value = audio_source.time / audio_source.clip.length; progress_slider.SetValueWithoutNotify(audio_source.time / audio_source.clip.length); } //播放结束后会自动停止,更新播放图标状态 if (playing && audio_source != null) { play_button.image.sprite = audio_source.isPlaying ? pause_sprite : play_sprite; } } else { if (_update_anyway || (video_player != null && video_player.isPlaying)) { //计算当前时间 currentHour = (int)video_player.time / 3600; currentMinute = (int)(video_player.time - currentHour * 3600) / 60; currentSecond = (int)(video_player.time - currentHour * 3600 - currentMinute * 60); progress_text.text = string.Format("{0:D2}:{1:D2}:{2:D2}/{3:D2}:{4:D2}:{5:D2}", currentHour, currentMinute, currentSecond, clipHour, clipMinute, clipSecond); //audio_progress_slider.value = audio_source.time / audio_source.clip.length; if (video_player.frame == -1) { progress_slider.SetValueWithoutNotify(0); } else { var _progress = (float)(video_player.time / video_player.length); progress_slider.SetValueWithoutNotify(_progress < 0 ? 0 : _progress); } } } } }