一:界面展示
功能键有:播放/暂停,是否循环播放,音量控制,倍速控制,视频切换,后退前进,显示时间。
二:unity面板
将对应内容拖到对应位置即可。
三:代码
using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class VideoController : MonoBehaviour
{
//持有控制视频播放的组件
public MediaPlayer mediaPlayer;
//持有播放暂停切换开关
public Toggle m_videoToggle;
//持有是否循环播放开关
public Toggle m_loopToggle;
//持有控制播放速度的下拉列表
public Dropdown m_playSpeedDropdown;
//持有控制视频播放进度的进度条
public Slider m_processSlider;
//持有显示当前播放与总播放的时间显示
public Text m_videoTimeTex;
//持有返回几秒前按钮
public Button m_backSecondsBtn;
//设置每次点击返回的秒数
private float m_backSeconds = 3f;
//持有控制音量的Slider
public Slider m_volumeSlider;
//持有静音开关
public Toggle m_muteToggle;
//存储静音状态前用户设置的音量
private float m_customVolume;
//切换为上一个视频,下一个视频
public Button lastBtn;
public Button nextBtn;
[Header("视频名称")]
string[] VideoNames;
//初始化
void Awake()
{
//视频名称的路径
VideoNames = File.ReadAllLines(Application.streamingAssetsPath + "/name.txt");
#region 事件监听
//注册播放暂停开关事件
m_videoToggle.onValueChanged.AddListener(DoPlayOrPause);
//注册是否循环播放开关事件
m_loopToggle.onValueChanged.AddListener(DoSetLoop);
//注册控制速度的滚动天触发事件
//添加下拉列表选项
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "2倍速"));
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "1.5倍速"));
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "1倍速"));
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "0.5倍"));
//设置初始速度显示值,默认为1倍速
m_playSpeedDropdown.value = 2;
m_playSpeedDropdown.captionText.text = m_playSpeedDropdown.options[2].text;
//注册控制速度的下拉列表触发事件
m_playSpeedDropdown.onValueChanged.AddListener(DoChangeSpeed);
//注册视频播放进度条值改变触发事件
m_processSlider.onValueChanged.AddListener(OnProcessSliderChange);
//注册返回n几秒前按钮触发事件
m_backSecondsBtn.onClick.AddListener(OnBackSecondsClick);
//注册音量Slider事件
m_volumeSlider.onValueChanged.AddListener(OnVolumeSliderChange);
//注册静音开关事件
m_muteToggle.onValueChanged.AddListener(OnMuteToggleClick);
//注册视频播放触发事件
mediaPlayer.Events.AddListener(MediaEventHandler);
//上一个按钮监听
lastBtn.onClick.AddListener(LastVideo);
//下一个按钮监听
nextBtn.onClick.AddListener(NextVideo);
#endregion
}
// 视频播放时间触发
private void MediaEventHandler(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
{
switch (arg1)
{
case MediaPlayerEvent .EventType .Closing :
Debug.Log("关闭播放器触发");
break;
case MediaPlayerEvent .EventType .Error :
Debug.Log("报错误时触发");
break;
case MediaPlayerEvent .EventType .FinishedPlaying ://注意:如果视频设置为循环播放模式,则不触发此项
Debug.Log("播放完成触发");
break;
case MediaPlayerEvent .EventType .FirstFrameReady :
Debug.Log("准备完触发");
break;
case MediaPlayerEvent.EventType.MetaDataReady:
Debug.Log("媒体数据准备准备中触发");
break;
case MediaPlayerEvent .EventType .ReadyToPlay :
Debug.Log("准备去播放触发");
break;
case MediaPlayerEvent .EventType .Started ://注意:每暂停之后的开始播放都会触发一次
Debug.Log("开始播放触发");
break;
default :
break;
}
}
void Start ()
{
LoadVideo();
//初始化触发一次(同步声音大小)
OnVolumeSliderChange(m_volumeSlider .value);
}
void Update()
{
//时刻更新播放进度方法
DoUpdateVideoProcess();
//时刻更新播放时间显示方法
UpdateTimeText();
}
// 加载视频方法
int index = 0;
void LoadVideo()
{
//通过插件中的方法加载(参数为:1.加载路径格式(与面板上相对应)2.加载的文件名 3.默认是否开始播放)
mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, VideoNames[index] + ".mp4", true);
}
#region 视频切换
// 下一个视频
void NextVideo()
{
index++;
if (index > VideoNames.Length - 1)
index = 0;
//视频播放
LoadVideo();
}
// 上一个视频
void LastVideo()
{
index--;
if (index<0)
index = VideoNames.Length - 1;
//视频播放
LoadVideo();
}
#endregion
#region 视频播放、暂停、循环
// 播放与暂停开关点击触发
void DoPlayOrPause(bool s_isOn)
{
//如果播放,开始播放并文字显示“播放”
if (s_isOn)
{
//通过持有的MediaPlayer类进行操控
mediaPlayer.Control.Play();
//更改播放开关显示的文字
m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "暂停";
}
//否则,暂停
else
{
mediaPlayer.Control.Pause();
//更改播放开关显示的文字
m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "播放";
}
}
// 是否循环播放开关点击触发
void DoSetLoop(bool s_isOn)
{
//通过持有的MediaPlayer类进行操控
mediaPlayer.Control.SetLooping(s_isOn);
}
#endregion
#region 倍速
// 改变播放速度方法(正的加速放映,负的倒放映)
void DoChangeSpeed(int s_speed)//下拉列表对应索引值
{
float tSpeed = 1;
switch (s_speed)
{
case 0:
tSpeed = 2;
break;
case 1:
tSpeed = 1.5f;
break;
case 2:
tSpeed = 1;
break;
case 3:
tSpeed = 0.5f;
break;
default :
Debug.Assert(false);
break;
}
mediaPlayer.Control.SetPlaybackRate(tSpeed);
}
#endregion
#region 进度条
// 时刻更新视频进度到滑动条上
void DoUpdateVideoProcess()
{
//获取当前播放时长
float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
//获取视频总长度
float tVideoTime = mediaPlayer.Info.GetDurationMs();
//计算出对应的播放进度赋值给显示播放进度的进度条
m_processSlider.value = tCurrentTime/tVideoTime;
}
// 更新播放进度的时间显示
void UpdateTimeText()
{
//对当前播放时间转换时间格式
//转化为 秒
int tCurrentSeconds = (int)mediaPlayer.Control.GetCurrentTimeMs()/1000;
//获取当前分数
int tCurrentMin = tCurrentSeconds/60;
//重新赋值剩余多少秒
tCurrentSeconds = tCurrentSeconds%60;
string tCurrentSecondStr = tCurrentSeconds < 10 ? "0" + tCurrentSeconds : tCurrentSeconds.ToString();
//对总时间转化时间格式
//转化为秒
int tVideoTimeSeconds = (int) mediaPlayer.Info.GetDurationMs()/1000;
//获取总的分数
int tVideoTimeMin = tVideoTimeSeconds/60;
//重新复制剩余多少秒
tVideoTimeSeconds = tVideoTimeSeconds%60;
string tVideoTimeSecondStr = tVideoTimeSeconds < 10 ? "0" + tVideoTimeSeconds : tVideoTimeSeconds.ToString();
//拼接一下时间显示字符串
string tTime = string.Format("<color=black>{0}:{1}/{2}:{3}</color>", tCurrentMin, tCurrentSecondStr, tVideoTimeMin, tVideoTimeSecondStr);
m_videoTimeTex.text = tTime ;;
}
// 视频播放进度条值改变触发
void OnProcessSliderChange(float value)
{
//获取视频总长度
float tVideoTime = mediaPlayer.Info.GetDurationMs();
//当前视频的时间
float tCurrentTime = m_processSlider.value*tVideoTime;
//将视频时间调到对应的节点
mediaPlayer.Control.Seek(tCurrentTime);
m_processSlider.transform.Find("Fill Area").Find("Fill").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
m_processSlider.transform.Find("Handle Slide Area").Find("Handle").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
}
// 播放进度条开始拖动触发(EventTrigger触发)
public void OnProcessSliderDragBegin()
{
//暂停播放
mediaPlayer.Control.Pause();
}
// 播放进度条结束拖动触发(EventTrigger触发)
public void OnProcessSliderDragEnd()
{
//开始播放
mediaPlayer.Control.Play();
}
// 返回到几秒之前方法
void OnBackSecondsClick()
{
//获取当前播放进度时间
float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
//10s前进度时间(如果存在前十秒则退,不存在还是当前时间进度)
tCurrentTime = (tCurrentTime - m_backSeconds * 1000) >= 0 ? tCurrentTime - m_backSeconds*1000 : tCurrentTime;
//设置进度时间
mediaPlayer.Control.Seek(tCurrentTime);
}
#endregion
#region 音量设置
// 音量进度条改变触发
void OnVolumeSliderChange(float value)
{
//保存当前已经设置的音量
if (value != 0)
{
m_customVolume = m_volumeSlider.value;
}
//设置音量
mediaPlayer.Control.SetVolume(value);
//如果音量手动调节到零,则将静音模式打开
if (value > 0)
{
m_muteToggle.isOn = false;
}
else
{
m_muteToggle.isOn = true;
}
}
// 静音开关触发
void OnMuteToggleClick(bool s_isOn)
{
//如果静音
if (s_isOn)
{
//设置静音
m_volumeSlider.value = 0;
mediaPlayer.Control.SetVolume(0);
}
//不静音
else
{
m_volumeSlider.value = m_customVolume;
mediaPlayer.Control.SetVolume(m_customVolume);
}
}
#endregion
}
其中视频存放在streamingAssets文件夹中,视频名称存放在一个名为“name”的txt文件中,通过读取name中视频的名称控制上一个,下一个视频的播放。
四:程序包
链接:https://pan.baidu.com/s/1A3L3lMaJFHrK2lIGD13NWA?pwd=jl98
提取码:jl98