1.官网下载该插件或者我分享的链接:
链接:https://pan.baidu.com/s/1boGeJ8r 密码:mvbf
2.新建项目导入资源,添加以下游戏物体与UI到场景中
3.此处先建立一个Canvas再创建
4.将创建好的MediaPlayer组件拖入
5.根据自定义脚本持有该组件,控制该组件面板上的属性来间接控制视屏的播放
6.根据自定义的脚本创建自定义的开关,滚动条等显示UI
7.常用的实现功能脚本如下
1 /*************************************************
2 * 项目名称:Unity实现视频播放功能
3 * 脚本创建人:魔卡
4 * 脚本创建时间:2017.12.21
5 * 脚本功能:控制视频播放类
6 * ***********************************************/
7 using System.Collections;
8 using System.Collections.Generic;
9 using RenderHeads.Media.AVProVideo;
10 using UnityEngine;
11 using UnityEngine.UI;
12
13 //控制视频播放类
14 public class VideoController : MonoBehaviour
15 {
16 //持有控制视频播放的组件
17 public MediaPlayer mediaPlayer;
18
19 //持有播放暂停切换开关
20 public Toggle m_videoToggle;
21
22 //持有是否循环播放开关
23 public Toggle m_loopToggle;
24
25 //持有控制播放速度滚动条
26 public Slider m_playSpeedSlider;
27 //持有控制播放速度的下拉列表
28 public Dropdown m_playSpeedDropdown;
29
30 //持有控制视频播放进度的进度条
31 public Slider m_processSlider;
32
33 //持有显示当前播放与总播放的时间显示
34 public Text m_videoTimeTex;
35
36 //持有返回几秒前按钮
37 public Button m_backSecondsBtn;
38 //设置每次点击返回的秒数
39 private float m_backSeconds = 3f;
40
41 //持有控制音量的Slider
42 public Slider m_volumeSlider;
43 //持有静音开关
44 public Toggle m_muteToggle;
45 //存储静音状态前用户设置的音量
46 private float m_customVolume;
47
48 void Awake()
49 {
50 //初始化
51 //注册播放暂停开关事件
52 m_videoToggle.onValueChanged.AddListener(DoPlayOrPause);
53 //注册是否循环播放开关事件
54 m_loopToggle.onValueChanged.AddListener(DoSetLoop);
55 //注册控制速度的滚动天触发事件
56 m_playSpeedSlider.onValueChanged.AddListener(DoChangeSpeed);
57
58 //添加下拉列表选项
59 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+4"));
60 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+3"));
61 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+2"));
62 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+1"));
63 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+0"));
64 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-1"));
65 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-2"));
66 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-3"));
67 m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-4"));
68 //设置初始速度显示值
69 m_playSpeedDropdown.value = 3;
70 m_playSpeedDropdown.captionText.text = m_playSpeedDropdown.options[3].text;
71 //注册控制速度的下拉列表触发事件
72 m_playSpeedDropdown.onValueChanged.AddListener(DoChangeSpeed);
73
74 //注册视频播放进度条值改变触发事件
75 m_processSlider.onValueChanged.AddListener(OnProcessSliderChange);
76
77 //注册返回1几秒前按钮触发事件
78 m_backSecondsBtn.onClick.AddListener(OnBackSecondsClick);
79
80 //注册音量Slider事件
81 m_volumeSlider.onValueChanged.AddListener(OnVolumeSliderChange);
82 //注册静音开关事件
83 m_muteToggle.onValueChanged.AddListener(OnMuteToggleClick);
84
85 //注册视频播放触发事件
86 mediaPlayer.Events.AddListener(MediaEventHandler);
87 }
88
89 /// <summary>
90 /// 视频播放时间触发
91 /// </summary>
92 /// <param name="arg0"></param>
93 /// <param name="arg1"></param>
94 /// <param name="arg2"></param>
95 private void MediaEventHandler(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
96 {
97 switch (arg1)
98 {
99 case MediaPlayerEvent .EventType .Closing :
100 Debug.Log("关闭播放器触发");
101 break;
102 case MediaPlayerEvent .EventType .Error :
103 Debug.Log("报错误时触发");
104 break;
105 case MediaPlayerEvent .EventType .FinishedPlaying ://注意:如果视频设置为循环播放模式,则不触发此项
106 Debug.Log("播放完成触发");
107 break;
108 case MediaPlayerEvent .EventType .FirstFrameReady :
109 Debug.Log("准备完触发");
110 break;
111 case MediaPlayerEvent.EventType.MetaDataReady:
112 Debug.Log("媒体数据准备准备中触发");
113 break;
114 case MediaPlayerEvent .EventType .ReadyToPlay :
115 Debug.Log("准备去播放触发");
116 break;
117 case MediaPlayerEvent .EventType .Started ://注意:每暂停之后的开始播放都会触发一次
118 Debug.Log("开始播放触发");
119 break;
120 default :
121 Debug.Assert(false);
122 break;
123 }
124 }
125
126 void Start ()
127 {
128 LoadVideo();
129
130 //初始化触发一次(同步声音大小)
131 OnVolumeSliderChange(m_volumeSlider .value);
132 }
133
134 void Update()
135 {
136 //时刻更新播放进度方法
137 DoUpdateVideoProcess();
138
139 //时刻更新播放时间显示方法
140 UpdateTimeText();
141 }
142
143 /// <summary>
144 /// 加载视频方法
145 /// </summary>
146 void LoadVideo()
147 {
148 //通过插件中的方法加载(参数为:1.加载路径格式(与面板上相对应)2.加载的文件名 3.默认是否开始播放)
149 mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, "BigBuckBunny_360p30.mp4", false);
150 }
151 /// <summary>
152 /// 播放与暂停开关点击触发
153 /// </summary>
154 /// <param name="s_isOn"></param>
155 void DoPlayOrPause(bool s_isOn)
156 {
157 //如果播放,开始播放并文字显示“播放”
158 if (s_isOn)
159 {
160 //通过持有的MediaPlayer类进行操控
161 mediaPlayer.Control.Play();
162 //更改播放开关显示的文字
163 m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "暂停";
164 }
165 //否则,暂停
166 else
167 {
168 mediaPlayer.Control.Pause();
169 //更改播放开关显示的文字
170 m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "播放";
171 }
172 }
173 /// <summary>
174 /// 是否循环播放开关点击触发
175 /// </summary>
176 /// <param name="s_isOn"></param>
177 void DoSetLoop(bool s_isOn)
178 {
179 //通过持有的MediaPlayer类进行操控
180 mediaPlayer.Control.SetLooping(s_isOn);
181 }
182 /// <summary>
183 /// 改变播放速度方法(正的加速放映,负的倒放映)
184 /// </summary>
185 void DoChangeSpeed(float s_speed)//滑动条数值
186 {
187 //有部分瑕疵(正序倒序放调节过快反应会迟缓,与电脑配置有关)
188 mediaPlayer.Control.SetPlaybackRate(s_speed);
189 }
190 /// <summary>
191 /// 改变播放速度方法(正的加速放映,负的倒放映)
192 /// </summary>
193 void DoChangeSpeed(int s_speed)//下拉列表对应索引值
194 {
195 int tSpeed = 1;
196 switch (s_speed)
197 {
198 case 0:
199 tSpeed = 4;
200 break;
201 case 1:
202 tSpeed = 3;
203 break;
204 case 2:
205 tSpeed = 2;
206 break;
207 case 3:
208 tSpeed = 1;
209 break;
210 case 4:
211 tSpeed = 0;
212 break;
213 case 5:
214 tSpeed = -1;
215 break;
216 case 6:
217 tSpeed = -2;
218 break;
219 case 7:
220 tSpeed = -3;
221 break;
222 case 8:
223 tSpeed = -4;
224 break;
225 default :
226 Debug.Assert(false);
227 break;
228 }
229 //有部分瑕疵(正序倒序放调节过快反应会迟缓,与电脑配置有关)
230 mediaPlayer.Control.SetPlaybackRate(tSpeed);
231 }
232
233 /// <summary>
234 /// 时刻更新视频进度到滑动条上
235 /// </summary>
236 void DoUpdateVideoProcess()
237 {
238 //获取当前播放时长
239 float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
240 //获取视频总长度
241 float tVideoTime = mediaPlayer.Info.GetDurationMs();
242 //计算出对应的播放进度赋值给显示播放进度的进度条
243 m_processSlider.value = tCurrentTime/tVideoTime;
244 }
245
246 /// <summary>
247 /// 更新播放进度的时间显示
248 /// </summary>
249 void UpdateTimeText()
250 {
251 //对当前播放时间转换时间格式
252 //转化为 秒
253 int tCurrentSeconds = (int)mediaPlayer.Control.GetCurrentTimeMs()/1000;
254 //获取当前分数
255 int tCurrentMin = tCurrentSeconds/60;
256 //重新赋值剩余多少秒
257 tCurrentSeconds = tCurrentSeconds%60;
258 string tCurrentSecondStr = tCurrentSeconds < 10 ? "0" + tCurrentSeconds : tCurrentSeconds.ToString();
259
260 //对总时间转化时间格式
261 //转化为秒
262 int tVideoTimeSeconds = (int) mediaPlayer.Info.GetDurationMs()/1000;
263 //获取总的分数
264 int tVideoTimeMin = tVideoTimeSeconds/60;
265 //重新复制剩余多少秒
266 tVideoTimeSeconds = tVideoTimeSeconds%60;
267 string tVideoTimeSecondStr = tVideoTimeSeconds < 10 ? "0" + tVideoTimeSeconds : tVideoTimeSeconds.ToString();
268
269 //拼接一下时间显示字符串
270 string tTime = string.Format("<color=red>{0}:{1}/{2}:{3}</color>", tCurrentMin, tCurrentSecondStr, tVideoTimeMin, tVideoTimeSecondStr);
271 //string tTime = string.Format("<b>{0}:{1}/{2}:{3}</b>", tCurrentMin, tCurrentSeconds, tVideoTimeMin, tVideoTimeSeconds);
272 //string tTime = string.Format("<i>{0}:{1}/{2}:{3}</i>", tCurrentMin, tCurrentSeconds, tVideoTimeMin, tVideoTimeSeconds);
273
274 m_videoTimeTex.text = tTime ;;
275 }
276
277 /// <summary>
278 /// 视频播放进度条值改变触发
279 /// </summary>
280 /// <param name="value"></param>
281 void OnProcessSliderChange(float value)
282 {
283 //获取视频总长度
284 float tVideoTime = mediaPlayer.Info.GetDurationMs();
285 //当前视频的时间
286 float tCurrentTime = m_processSlider.value*tVideoTime;
287 //将视频时间调到对应的节点
288 mediaPlayer.Control.Seek(tCurrentTime);
289 }
290
291
292 /// <summary>
293 /// 播放进度条开始拖动触发(EventTrigger触发)
294 /// </summary>
295 public void OnProcessSliderDragBegin()
296 {
297 //暂停播放
298 mediaPlayer.Control.Pause();
299 }
300
301 /// <summary>
302 /// 播放进度条结束拖动触发(EventTrigger触发)
303 /// </summary>
304 public void OnProcessSliderDragEnd()
305 {
306 //开始播放
307 mediaPlayer.Control.Play();
308 }
309
310
311 /// <summary>
312 /// 返回到几秒之前方法
313 /// </summary>
314 void OnBackSecondsClick()
315 {
316 //获取当前播放进度时间
317 float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
318
319 //10s前进度时间(如果存在前十秒则退,不存在还是当前时间进度)
320 tCurrentTime = (tCurrentTime - m_backSeconds * 1000) >= 0 ? tCurrentTime - m_backSeconds*1000 : tCurrentTime;
321
322 //设置进度时间
323 mediaPlayer.Control.Seek(tCurrentTime);
324 }
325
326 /// <summary>
327 /// 音量进度条改变触发
328 /// </summary>
329 /// <param name="value"></param>
330 void OnVolumeSliderChange(float value)
331 {
332 //保存当前已经设置的音量
333 if (value != 0)
334 {
335 m_customVolume = m_volumeSlider.value;
336 }
337 //设置音量
338 mediaPlayer.Control.SetVolume(value);
339 //如果音量手动调节到零,则将静音模式打开
340 if (value > 0)
341 {
342 m_muteToggle.isOn = false;
343 }
344 else
345 {
346 m_muteToggle.isOn = true;
347 }
348 }
349
350 /// <summary>
351 /// 静音开关触发
352 /// </summary>
353 /// <param name="s_isOn"></param>
354 void OnMuteToggleClick(bool s_isOn)
355 {
356 //如果静音
357 if (s_isOn)
358 {
359 //设置静音
360 m_volumeSlider.value = 0;
361 mediaPlayer.Control.SetVolume(0);
362 }
363 //不静音
364 else
365 {
366 m_volumeSlider.value = m_customVolume;
367 mediaPlayer.Control.SetVolume(m_customVolume);
368 }
369 }
370 }