关于Unity视频播放器插件 AVPro Video(一)平面UI视频播放

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 }

 

 

posted @ 2017-12-22 19:27  魔卡先生  阅读(24727)  评论(0编辑  收藏  举报