实现视频组件的基本功能;API可以直接在官方查
传送门:Unity 手册
废话不多说直接上脚本
最主要的是 VideoPlayer 视频播放组件,暂停、播放、重播、进度条、当前时长、进度条拖曳控制时长这些根据需要来就行,这里面这些都大致有,可做参考;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using UnityEngine.UI;
using Unity.VisualScripting;
//using DG.Tweening; //引入命名空间
using UnityEngine.UIElements;
public class Video : MonoBehaviour
{
/*****************************************************************
实现功能:
视频 播放、暂停、重播、当前播放时间、进度条显示、拖动进度条改变播放
最终修改日期:2024/2/23 14:50
******************************************************************/
//按键接口 点击实现——展开和关闭
// public UnityEngine.UI.Button _unfold;
//public UnityEngine.UI.Button _close;
[Header("视频播放组件")]
public VideoPlayer videoPlayer;//视频播放组件
[Header("进度条组件")]
public UnityEngine.UI.Slider slider;//进度条组件
//滑块未启用
[Header("控制进度滑块")]
public RectTransform handle;//控制进度 滑块
private bool isDraggingSlider = false;//是否对对滑块进行拖拽
[Header("进度条时间显示")]
public Text schedule;//进度条时间显示
private string schedule_0;//进度条总时间
private string schedule_1;//进度条实时时间
[Header("暂停按键")]
public UnityEngine.UI.Button Video_Pause;//暂停
[Header("播放按键")]
public UnityEngine.UI.Button Video_Play;//播放
[Header("重播按键")]
public UnityEngine.UI.Button Video_Rebroadcast;//重播
[Header("如果播放暂停按键在同一个位置就使用这个 没有在同一位置挂载空物体即可")]
[Header("播放按键物体")]
public GameObject Video_bf;
[Header("暂停按键物体")]
public GameObject Video_zt;
void Start()
{
videoPlayer.waitForFirstFrame = true;//设置预先缓存一帧
// videoPlayer.playOnAwake = true;//设置运行时播放
// videoPlayer.isLooping = true;//设置是否循环播放
//音频输出模式
// videoPlayer.GetTargetAudioSource(0).mute = false; //控制视频静音
//videoPlayer.GetTargetAudioSource(0).volume = 0.5f; //控制视频音量大小
// videoPlayer.SetDirectAudioVolume(0, volume);
// videoPlayer.playbackSpeed = 1f; //设置视频倍速
//获取时长进度条
if (videoPlayer == null)
{
videoPlayer = GetComponent<VideoPlayer>();
}
// slider_a();
/* Video_Play.onClick.AddListener(OnplayorpauseVideo);
Video_Pause.onClick.AddListener(OnplayorpauseVideo);*/
Video_Play.onClick.AddListener(Video_Play_Click);//播放按键
Video_Pause.onClick.AddListener(Video_Pause_Click);//暂停按键
Video_Rebroadcast.onClick.AddListener(Video_Rebroadcast_Click);//重播按键
}
//获取视频的时长
public void slider_a()
{
if (slider != null)
{//得到进度条的时长
slider.minValue = 0;
slider.maxValue = (float)videoPlayer.frameCount / (float)videoPlayer.frameRate;//视频总时长videoPlayer.frameRate
// slider.onValueChanged.AddListener(OnSliderValueChanged);
}
schedule_0 = ((int)(videoPlayer.frameCount / videoPlayer.frameRate + 0.5f)).ToSafeString();//视频总时长
// Debug.Log((int)(videoPlayer.frameCount / videoPlayer.frameRate + 0.5f));
}
//把播放进度设为进度条的时间
public void OnSliderValueChanged(float value)
{
videoPlayer.time = value;
}
void Update()
{
if (videoPlayer.isPlaying)
{
schedule_1 = ((int)videoPlayer.time).ToSafeString();//当前进度时间videoPlayer.time
//进度条
slider.value = (float)videoPlayer.time / ((float)(videoPlayer.frameCount / videoPlayer.frameRate + 0.5f));
// Debug.Log("当前播放时间:" + schedule_1 + "秒");
schedule.text = schedule_1 + "s" + "/" + schedule_0 + "s";
}
if (videoPlayer.isPlaying)//正在播放 或暂停状态就切换按键
{
Video_bf.SetActive(false);
Video_zt.SetActive(true);
}
else //if (!videoPlayer.isPlaying)
{
Video_bf.SetActive(true);
Video_zt.SetActive(false);
}
}
//播放状态就暂停 暂停状态就播放
//复用一个按键的时候 可以这么玩
private void OnplayorpauseVideo()
{
if (videoPlayer.enabled == true)
{
if (videoPlayer.isPlaying)
{
videoPlayer.Pause();
Video_bf.SetActive(true);
Video_zt.SetActive(false);
}
else if (!videoPlayer.isPlaying)
{
videoPlayer.Play();
Video_bf.SetActive(false);
Video_zt.SetActive(true);
}
}
}
//实现重播功能
public void Video_Rebroadcast_Click()
{
videoPlayer.Stop();
videoPlayer.Play();
}
//点击进入暂停状态
public void Video_Pause_Click()
{
videoPlayer.Pause();//暂停
Video_bf.SetActive(true);
Video_zt.SetActive(false);
}
//点击进入播放状态
public void Video_Play_Click()
{
videoPlayer.Play();//播放
Video_bf.SetActive(false);
Video_zt.SetActive(true);
}
/// <summary>
/// 输入秒数 将其转化为 分秒形态
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private string ToTimeFormat(float time)
{
int seconds = (int)time;
int minutes = seconds / 60;
seconds %= 60;
return string.Format("{0:D2}:{1:D2}", minutes, seconds);
}
/// <summary>
/// 输入多少秒对应物体 延时执行操作
/// </summary>
/// <param name="delay"></param>
// public void Video_(float delay)//物体 多少秒后消失 无动画版本
// {
// // 使用DOVirtual.DelayedCall延迟
// DOVirtual.DelayedCall(delay, () =>
// { //延时后执行的操作
// slider.value = (float)videoPlayer.time;
// });
// }
/// <summary>
/// 实现进度条的拖动 改变
/// </summary>
/* private void OnMouseDrag()//开始拖拽进度条
{
isDraggingSlider = true;
Debug.Log("开始拖动进度条");
}
private void OnMouseUp()//结束拖拽进度条
{
slider.value = (float)videoPlayer.time;
isDraggingSlider = false;
Debug.Log("结束拖动进度条");
}*/
}