Unity VideoPlayer播放视频 Slider控制播放进度

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
public class ToPlayVideo : MonoBehaviour
{
    public VideoClip[] videoClips;      // 视频的文件 参数
    public Text videoTimeText;          // 视频的当前时间 Text
    public Text videoNameText;          // 视频的总时长 Text
    public Slider videoTimeSlider;      // 视频的时间 Slider
    // 定义参数获取VideoPlayer组件和RawImage组件
    internal VideoPlayer videoPlayer;
    private RawImage rawImage;
    public Texture pingBao;             // 屏保图片
    // 当前视频的总时间值和当前播放时间值的参数
    private int currentHour;
    private int currentMinute;
    private int currentSecond;
    private int clipHour;
    private int clipMinute;
    private int clipSecond;

    public Sprite play;
    public Sprite pause;
    private bool isPlay = true;          //是否正在播放视频
    public Button playPauseButton;       //播放暂停按钮
    public Button stopButton;            //停止播放按钮
    public Button button1;
    public Button button2;
    public Button button3;
    public Button button4;

    // Use this for initialization
    void Start()
    {
        //清空文本
        videoNameText.text = "";
        videoTimeText.text = "";

        //获取场景中对应的组件
        videoPlayer = this.GetComponent<VideoPlayer>();
        rawImage = this.GetComponent<RawImage>();
        videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
        videoPlayer.SetTargetAudioSource(0, this.GetComponent<AudioSource>());
        videoPlayer.playOnAwake = false;
        videoPlayer.IsAudioTrackEnabled(0);

        playPauseButton.onClick.AddListener(PlayOrPause);
        stopButton.onClick.AddListener(StopVideo);
        button1.onClick.AddListener(delegate { OnClick(0); });
        button2.onClick.AddListener(delegate { OnClick(1); });
        button3.onClick.AddListener(delegate { OnClick(2); });
        button4.onClick.AddListener(delegate { OnClick(3); });
    }

    // Update is called once per frame
    void Update()
    {
        //如果videoPlayer没有对应的视频texture,则返回屏保
        if (videoPlayer.texture == null)
        {
            rawImage.texture = pingBao;
            return;
        }
        //把VideoPlayerd的视频渲染到UGUI的RawImage
        rawImage.texture = videoPlayer.texture;
        ShowVideoTime();
    }

    /// <summary>
    /// 显示当前视频的时间
    /// </summary>
    private void ShowVideoTime()
    {
        // 当前的视频播放时间
        currentHour = (int)videoPlayer.time / 3600;
        currentMinute = (int)(videoPlayer.time - currentHour * 3600) / 60;
        currentSecond = (int)(videoPlayer.time - currentHour * 3600 - currentMinute * 60);
        // 把当前视频播放的时间显示在 Text 上
        videoTimeText.text = string.Format("{0:D2}:{1:D2}:{2:D2}",
            currentHour, currentMinute, currentSecond);
        // 把当前视频播放的时间比例赋值到 Slider 上
        videoTimeSlider.value = (float)(videoPlayer.time / videoPlayer.clip.length);
    }

    /// <summary>
    /// 显示视频的总时长
    /// </summary>
    /// <param name="videos">当前视频</param>
    void ShowVideoLength(VideoClip videos)
    {
        videoPlayer.clip = videos;
        videoPlayer.Play();
        videoTimeSlider.gameObject.SetActive(true);
        clipHour = (int)videoPlayer.clip.length / 3600;
        clipMinute = (int)(videoPlayer.clip.length - clipHour * 3600) / 60;
        clipSecond = (int)(videoPlayer.clip.length - clipHour * 3600 - clipMinute * 60);
        videoNameText.text = string.Format("{0:D2}:{1:D2}:{2:D2} ",
             clipHour, clipMinute, clipSecond);
    }

    private void OnClick(int num)
    {
        switch (num)
        {
            case 0:
                ShowVideoLength(videoClips[0]);
                break;
            case 1:
                ShowVideoLength(videoClips[1]);
                break;
            case 2:
                ShowVideoLength(videoClips[2]);
                break;
            case 3:
                ShowVideoLength(videoClips[3]);
                break;
            case 4:
                ShowVideoLength(videoClips[4]);
                break;
            default:
                break;
        }
    }

    /// <summary>
    /// 视频播放暂停
    /// </summary>
    void PlayOrPause()
    {
        //如果视频片段不为空,并且视频画面没有播放完毕
        if (videoPlayer.clip != null && (ulong)videoPlayer.frame < videoPlayer.frameCount)
        {
            //如果视频正在播放
            if (isPlay)
            {
                playPauseButton.image.sprite = pause;
                videoPlayer.Pause();
                isPlay = false;
            }
            else
            {
                playPauseButton.image.sprite = play;
                videoPlayer.Play();
                isPlay = true;
            }
        }
    }

    void StopVideo()
    {
        videoPlayer.Stop();
        playPauseButton.image.sprite = play;
        videoTimeSlider.gameObject.SetActive(false);
        videoNameText.text = "";
        videoTimeText.text = "";
        isPlay = true;
    }
}
using UnityEngine;
using UnityEngine.EventSystems;
/// <summary>
/// 继承 拖拽接口
/// </summary>
public class SliderEvent : MonoBehaviour, IDragHandler, IEndDragHandler
{
    [SerializeField]
    public ToPlayVideo toPlayVideo;        // 视频播放的脚本

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

    /// <summary>
    /// 给 Slider 添加开始拖拽事件
    /// </summary>
    /// <param name="eventData"></param>
    public void OnDrag(PointerEventData eventData)
    {
        toPlayVideo.videoPlayer.Pause();
        SetVideoTimeValueChange();
    }

    /// <summary>
    /// 当前的 Slider 比例值转换为当前的视频播放时间
    /// </summary>
    private void SetVideoTimeValueChange()
    {
        toPlayVideo.videoPlayer.time = toPlayVideo.videoTimeSlider.value * toPlayVideo.videoPlayer.clip.length;
    }

    /// <summary>
    /// 给 Slider 添加结束拖拽事件
    /// </summary>
    /// <param name="eventData"></param>
    public void OnEndDrag(PointerEventData eventData)
    {
        toPlayVideo.videoPlayer.Play();
    }
}

 

  • 7
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Unity VideoPlayerUnity引擎中的一个组件,用于在游戏或应用程序中播放视频。它可以加载外部视频资源,并提供视频播放控制功能,如播放、暂停、停止。同时,它还可以切换本地视频,获取视频播放进度控制音量等。 在使用Unity VideoPlayer播放视频时,有时可能会遇到闪现上一个视频画面的问题。这个问题可能是由于视频加载和播放的过程中,上一个视频的画面没有完全清除导致的。一种解决方法是在切换视频之前,先停止之前的视频播放,然后再加载和播放新的视频。这样可以确保每次切换视频时都能正常显示新视频的画面。 总结起来,Unity VideoPlayerUnity引擎中的一个功能强大的组件,可以用于加载和播放视频,并提供了丰富的视频控制功能。在使用时需要注意处理视频切换时可能出现的闪现问题,可以通过停止之前的视频播放来解决。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Unity视频播放Video Player的简单使用](https://blog.csdn.net/weixin_42396898/article/details/124122678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [UnityVIdeoPlayer视频外部加载- 源码](https://download.csdn.net/download/qq_14862207/10803147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值