关于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 }
但行好事,莫问前程!