zoukankan      html  css  js  c++  java
  • 关于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 }
     

  • 相关阅读:
    详解用em替换px
    js判断是否为ie浏览器
    nth-child()选择器小结
    HTML5之canvas
    MQTT-SN协议乱翻之消息格式
    MQTT-SN协议乱翻之简要介绍
    MQTT 3.1.1,值得升级的6个新特性
    MQTT 3.1协议非严肃反思录
    MQTT协议笔记之mqtt.io项目HTTP协议支持
    MQTT协议笔记之mqtt.io项目Websocket协议支持
  • 原文地址:https://www.cnblogs.com/mrmocha/p/8087389.html
Copyright © 2011-2022 走看看