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