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

被折叠的 条评论
为什么被折叠?



