unity videoplay视频播放控制、进度条

本文介绍了一个Unity中的视频播放控制器实现,包括视频的播放、暂停、停止、切换上下视频及进度控制等功能。通过代码示例展示了如何使用Unity的VideoPlayer组件结合UI控件实现这些功能。

unity videoplay视频播放控制、进度条

废话不多说直接上代码,部分代码是借用了别人的写法,加上自己的认识做了修改基本上能满足日常的视频播放需要。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

///

///
public class VideoController : MonoBehaviour
{
//设置VideoPlayer、RawImage和当前播放视频索引参数
public VideoPlayer videoPlayer;
public RawImage rawImage;
private int currentClipIndex;
//设置相关文本和按钮参数以及视频列表
public Text text_PlayOrPause;
public Button button_PlayOrPause;
public Button button_Pre;
public Button button_stop;
public Button button_Next;
public VideoClip[] videoClips;
public Slider MVSlkder;

void Start()
{
    //获取VideoPlayer和RawImage组件,以及初始化当前视频索引
    //videoPlayer = this.GetComponent<VideoPlayer>();
   /// rawImage = this.GetComponent<RawImage>();
    currentClipIndex = 0;
    //设置相关按钮监听事件
    MVSlkder.onValueChanged.AddListener(delegate { OnMVSlkder(); });
   
    button_PlayOrPause.onClick.AddListener(OnPlayOrPauseVideo);
    button_stop.onClick.AddListener(Onstop);
    button_Pre.onClick.AddListener(OnPreVideo);
    button_Next.onClick.AddListener(OnNextVideo);
    

}

void OnDestroy()
{
  ///  videoPlayer.loopPointReached -= OnVideoLoopOrPlayFinished;
   
}

//
// Update is called once per frame
void Update()
{
    //没有视频则返回,不播放
    if (videoPlayer.texture == null)
    {
        return;
    }
    //渲染视频到UGUI上
    rawImage.texture = videoPlayer.texture;

    if (videoPlayer.isPlaying)
    {
        if (videoPlayer.frame >= (long)videoPlayer.frameCount - 2)//也可以这么判断是否播放完毕
        {
            Onstop();
        }
        MVSlkder.maxValue = videoPlayer.frameCount;

    }
   
       // Debug.Log("videoPlayer.frameCount:" + videoPlayer.frameCount);
       // Debug.Log("videoPlayer.frame" + videoPlayer.frame);

        text_PlayOrPause.text = ComputingTime(GetCountTime()) + "/" + ComputingTime(GetTime());
  

}
void Onstop()
{
    videoPlayer.Stop();
    NotificationCenter.DefaultCenter().PostNotification(this, "ApplyDamage","sfeasfe");    /////对外发送一个消息

}
string ComputingTime(int times)
{
    int timmm = times;
    string timstr="";
    int h = timmm / 3600;
    if(h>1)
    {
        timmm = timmm - h * 3600;
    }

    int m = timmm / 60;
    if(m>1)
    {
        timmm = timmm - m * 60;
    }

    timstr = h.ToString() + ":" + m.ToString() + ":" + timmm.ToString();

    return timstr;
}
/// <summary>
/// 获取视频时长
/// </summary>
/// <returns></returns>
public int GetTime()
{
    return (int)(videoPlayer.frameCount / videoPlayer.frameRate + 0.5f);
}


/// <summary>
/// 获取视频当前时间
/// </summary>
/// <returns></returns>
public int GetCountTime()
{
   // 
    return (int)(videoPlayer.frame / videoPlayer.frameRate + 0.5f);
}
/// <summary>
/// 设置播放时间点
/// </summary>
/// <param name="time"></param>
public void SetTime(int time)
{
    videoPlayer.frame = (long)(time);
    videoPlayer.Play();
}



/// <summary>
/// 播放和暂停当前视频
/// </summary>
private void OnPlayOrPauseVideo()
{
    //判断视频播放情况,播放则暂停,暂停就播放,并更新相关文本
    if (videoPlayer.isPlaying == true)
    {
       
        videoPlayer.Pause();
        button_PlayOrPause.GetComponentInChildren<Text>().text = "播放";
        text_PlayOrPause.text = "播放";
    }
    else
    {
        videoPlayer.Play();
       
        button_PlayOrPause.GetComponentInChildren<Text>().text = "暂停";
        text_PlayOrPause.text = "暂停";
    }
    MVSlkder.minValue = 0;
    MVSlkder.maxValue = videoPlayer.frameCount;
    InvokeRepeating("delayUpdata", 0.5f, 0.5f);//1秒后调用 delafyOpen() 函数,之后每1秒调用一次 ,
}
/// <summary>
/// 更新滚动条参数内容
/// </summary>
void delayUpdata()/////
{
    MVSlkder.value = videoPlayer.frame;
}
/// <summary>
/// 切换上一个视频
/// </summary>
private void OnPreVideo()
{
    //视频列表减一播放上一个视频,并进行避免越界操作
    currentClipIndex -= 1;
    if (currentClipIndex < 0)
    {
        currentClipIndex = videoClips.Length - 1;
    }
    videoPlayer.clip = videoClips[currentClipIndex];
    text_PlayOrPause.text = "暂停";
}

/// <summary>
/// 切换下一个视频
/// </summary>
private void OnNextVideo()
{
    //视频列表加一播放下一个视频,并进行避免越界操作
    currentClipIndex += 1;
    currentClipIndex = currentClipIndex % videoClips.Length;
    videoPlayer.clip = videoClips[currentClipIndex];
    text_PlayOrPause.text = "暂停";
}
private void OnMVSlkder()
{
  
   
    SetTime((int)MVSlkder.value);
    
 
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值