Unity 组件简单的实现一个视频播放、暂停、重播 控制

实现视频组件的基本功能;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("结束拖动进度条");
    }*/

}

猜你喜欢

转载自blog.csdn.net/2302_76605236/article/details/140609384