您的位置:首页 > 移动开发 > Unity3D

关于Unity视频播放器插件AVProVideo的常用功能实现

2019-03-20 18:21 615 查看

1.控制该组件面板上的属性来间接控制视屏的播放

2.常用的实现功能脚本如下

[code]  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 }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐