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

1.官网下载该插件或者我分享的链接:

 

链接:https://pan.baidu.com/s/1boGeJ8r 密码:mvbf

2.新建项目导入资源,添加以下游戏物体与UI到场景中

 

3.此处先建立一个Canvas再创建

 

 

4.将创建好的MediaPlayer组件拖入

 

 

5.根据自定义脚本持有该组件,控制该组件面板上的属性来间接控制视屏的播放

 

 

 

6.根据自定义的脚本创建自定义的开关,滚动条等显示UI

 

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

/*************************************************
 * 项目名称:Unity实现视频播放功能
 * 脚本创建人:魔卡
 * 脚本创建时间:2017.12.21
 * 脚本功能:控制视频播放类
 * ***********************************************/
using System.Collections;
using System.Collections.Generic;
using RenderHeads.Media.AVProVideo;
using UnityEngine;
using UnityEngine.UI;

//控制视频播放类
public class VideoController : MonoBehaviour
{
    //持有控制视频播放的组件
    public MediaPlayer mediaPlayer;

    //持有播放暂停切换开关
    public Toggle m_videoToggle;

    //持有是否循环播放开关
    public Toggle m_loopToggle;

    //持有控制播放速度滚动条
    public Slider m_playSpeedSlider;
    //持有控制播放速度的下拉列表
    public Dropdown m_playSpeedDropdown;

    //持有控制视频播放进度的进度条
    public Slider m_processSlider;

    //持有显示当前播放与总播放的时间显示
    public Text m_videoTimeTex;

    //持有返回几秒前按钮
    public Button m_backSecondsBtn;
    //设置每次点击返回的秒数
    private float m_backSeconds = 3f;

    //持有控制音量的Slider
    public Slider m_volumeSlider;
    //持有静音开关
    public Toggle m_muteToggle;
    //存储静音状态前用户设置的音量
    private float m_customVolume;

    void Awake()
    {
        //初始化
        //注册播放暂停开关事件
        m_videoToggle.onValueChanged.AddListener(DoPlayOrPause);
        //注册是否循环播放开关事件
        m_loopToggle.onValueChanged.AddListener(DoSetLoop);
        //注册控制速度的滚动天触发事件
        m_playSpeedSlider.onValueChanged.AddListener(DoChangeSpeed);
       
        //添加下拉列表选项
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+4"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+3"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+2"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+1"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "+0"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-1"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-2"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-3"));
        m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "-4"));
        //设置初始速度显示值
        m_playSpeedDropdown.value = 3;
        m_playSpeedDropdown.captionText.text = m_playSpeedDropdown.options[3].text;
        //注册控制速度的下拉列表触发事件
        m_playSpeedDropdown.onValueChanged.AddListener(DoChangeSpeed);

        //注册视频播放进度条值改变触发事件
        m_processSlider.onValueChanged.AddListener(OnProcessSliderChange);

        //注册返回1几秒前按钮触发事件
        m_backSecondsBtn.onClick.AddListener(OnBackSecondsClick);

        //注册音量Slider事件
        m_volumeSlider.onValueChanged.AddListener(OnVolumeSliderChange);
        //注册静音开关事件
        m_muteToggle.onValueChanged.AddListener(OnMuteToggleClick);

        //注册视频播放触发事件
        mediaPlayer.Events.AddListener(MediaEventHandler);
    }

    /// <summary>
    /// 视频播放时间触发
    /// </summary>
    /// <param name="arg0"></param>
    /// <param name="arg1"></param>
    /// <param name="arg2"></param>
    private void MediaEventHandler(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
    {
        switch (arg1)
        {
            case MediaPlayerEvent .EventType .Closing :
                Debug.Log("关闭播放器触发");
                break;
            case MediaPlayerEvent .EventType .Error :
                Debug.Log("报错误时触发");
                break;
            case MediaPlayerEvent .EventType .FinishedPlaying ://注意:如果视频设置为循环播放模式,则不触发此项
                Debug.Log("播放完成触发");
                break;
            case MediaPlayerEvent .EventType .FirstFrameReady :
                Debug.Log("准备完触发");
                break;
            case MediaPlayerEvent.EventType.MetaDataReady:
                Debug.Log("媒体数据准备准备中触发");
                break;
            case MediaPlayerEvent .EventType .ReadyToPlay :
                Debug.Log("准备去播放触发");
                break;
            case MediaPlayerEvent .EventType .Started ://注意:每暂停之后的开始播放都会触发一次
                Debug.Log("开始播放触发");
                break;
            default :
                Debug.Assert(false);
                break;
        }
    }

    void Start ()
    {
        LoadVideo();

        //初始化触发一次(同步声音大小)
        OnVolumeSliderChange(m_volumeSlider .value);
    }

    void Update()
    {
        //时刻更新播放进度方法
        DoUpdateVideoProcess();

        //时刻更新播放时间显示方法
        UpdateTimeText();
    }

    /// <summary>
    /// 加载视频方法
    /// </summary>
    void LoadVideo()
    {
        //通过插件中的方法加载(参数为:1.加载路径格式(与面板上相对应)2.加载的文件名 3.默认是否开始播放)
        mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, "BigBuckBunny_360p30.mp4", false);
    }
    /// <summary>
    /// 播放与暂停开关点击触发
    /// </summary>
    /// <param name="s_isOn"></param>
    void DoPlayOrPause(bool s_isOn)
    {
        //如果播放,开始播放并文字显示“播放”
        if (s_isOn)
        {
            //通过持有的MediaPlayer类进行操控
            mediaPlayer.Control.Play();
            //更改播放开关显示的文字
            m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "暂停";
        }
            //否则,暂停
        else
        {
            mediaPlayer.Control.Pause();
            //更改播放开关显示的文字
            m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "播放";
        }
    }
    /// <summary>
    /// 是否循环播放开关点击触发
    /// </summary>
    /// <param name="s_isOn"></param>
    void DoSetLoop(bool s_isOn)
    {
        //通过持有的MediaPlayer类进行操控
        mediaPlayer.Control.SetLooping(s_isOn);
    }
    /// <summary>
    /// 改变播放速度方法(正的加速放映,负的倒放映)
    /// </summary>
    void DoChangeSpeed(float s_speed)//滑动条数值
    {
        //有部分瑕疵(正序倒序放调节过快反应会迟缓,与电脑配置有关)
        mediaPlayer.Control.SetPlaybackRate(s_speed);
    }
    /// <summary>
    /// 改变播放速度方法(正的加速放映,负的倒放映)
    /// </summary>
    void DoChangeSpeed(int s_speed)//下拉列表对应索引值
    {
        int tSpeed = 1;
        switch (s_speed)
        {
            case 0:
                tSpeed = 4;
                break;
            case 1:
                tSpeed = 3;
                break;
            case 2:
                tSpeed = 2;
                break;
            case 3:
                tSpeed = 1;
                break;
            case 4:
                tSpeed = 0;
                break;
            case 5:
                tSpeed = -1;
                break;
            case 6:
                tSpeed = -2;
                break;
            case 7:
                tSpeed = -3;
                break;
            case 8:
                tSpeed = -4;
                break;
            default :
                Debug.Assert(false);
                break;
        }
        //有部分瑕疵(正序倒序放调节过快反应会迟缓,与电脑配置有关)
        mediaPlayer.Control.SetPlaybackRate(tSpeed);
    }

    /// <summary>
    /// 时刻更新视频进度到滑动条上
    /// </summary>
    void DoUpdateVideoProcess()
    {
        //获取当前播放时长
        float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
        //获取视频总长度
        float tVideoTime = mediaPlayer.Info.GetDurationMs();
        //计算出对应的播放进度赋值给显示播放进度的进度条
        m_processSlider.value = tCurrentTime/tVideoTime;
    }

    /// <summary>
    /// 更新播放进度的时间显示
    /// </summary>
    void UpdateTimeText()
    {
        //对当前播放时间转换时间格式
        //转化为 秒
        int tCurrentSeconds = (int)mediaPlayer.Control.GetCurrentTimeMs()/1000;
        //获取当前分数
        int tCurrentMin = tCurrentSeconds/60;
        //重新赋值剩余多少秒
        tCurrentSeconds = tCurrentSeconds%60;
        string tCurrentSecondStr = tCurrentSeconds < 10 ? "0" + tCurrentSeconds : tCurrentSeconds.ToString();

        //对总时间转化时间格式
        //转化为秒
        int tVideoTimeSeconds = (int) mediaPlayer.Info.GetDurationMs()/1000;
        //获取总的分数
        int tVideoTimeMin = tVideoTimeSeconds/60;
        //重新复制剩余多少秒
        tVideoTimeSeconds = tVideoTimeSeconds%60;
        string tVideoTimeSecondStr = tVideoTimeSeconds < 10 ? "0" + tVideoTimeSeconds : tVideoTimeSeconds.ToString();

        //拼接一下时间显示字符串
        string tTime = string.Format("<color=red>{0}:{1}/{2}:{3}</color>", tCurrentMin, tCurrentSecondStr, tVideoTimeMin, tVideoTimeSecondStr);
        //string tTime = string.Format("<b>{0}:{1}/{2}:{3}</b>", tCurrentMin, tCurrentSeconds, tVideoTimeMin, tVideoTimeSeconds);
        //string tTime = string.Format("<i>{0}:{1}/{2}:{3}</i>", tCurrentMin, tCurrentSeconds, tVideoTimeMin, tVideoTimeSeconds);

        m_videoTimeTex.text =  tTime ;;
    }

    /// <summary>
    /// 视频播放进度条值改变触发
    /// </summary>
    /// <param name="value"></param>
    void OnProcessSliderChange(float value)
    {
        //获取视频总长度
        float tVideoTime = mediaPlayer.Info.GetDurationMs();
        //当前视频的时间
        float tCurrentTime = m_processSlider.value*tVideoTime;
        //将视频时间调到对应的节点
        mediaPlayer.Control.Seek(tCurrentTime);
    }


    /// <summary>
    /// 播放进度条开始拖动触发(EventTrigger触发)
    /// </summary>
    public void OnProcessSliderDragBegin()
    {
        //暂停播放
        mediaPlayer.Control.Pause();
    }

    /// <summary>
    /// 播放进度条结束拖动触发(EventTrigger触发)
    /// </summary>
    public void OnProcessSliderDragEnd()
    {
        //开始播放
        mediaPlayer.Control.Play();
    }


    /// <summary>
    /// 返回到几秒之前方法
    /// </summary>
    void OnBackSecondsClick()
    {
        //获取当前播放进度时间
        float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();

        //10s前进度时间(如果存在前十秒则退,不存在还是当前时间进度)
        tCurrentTime = (tCurrentTime - m_backSeconds * 1000) >= 0 ? tCurrentTime - m_backSeconds*1000 : tCurrentTime;

        //设置进度时间
        mediaPlayer.Control.Seek(tCurrentTime);
    }

    /// <summary>
    /// 音量进度条改变触发
    /// </summary>
    /// <param name="value"></param>
    void OnVolumeSliderChange(float value)
    {
        //保存当前已经设置的音量
        if (value != 0)
        {
            m_customVolume = m_volumeSlider.value;
        }
        //设置音量
        mediaPlayer.Control.SetVolume(value);
        //如果音量手动调节到零,则将静音模式打开
        if (value > 0)
        {
            m_muteToggle.isOn = false;
        }
        else
        {
            m_muteToggle.isOn = true;
        }
    }

    /// <summary>
    /// 静音开关触发
    /// </summary>
    /// <param name="s_isOn"></param>
    void OnMuteToggleClick(bool s_isOn)
    {
        //如果静音
        if (s_isOn)
        {
            //设置静音
            m_volumeSlider.value = 0;
            mediaPlayer.Control.SetVolume(0);
        }
            //不静音
        else
        {
            m_volumeSlider.value = m_customVolume;
            mediaPlayer.Control.SetVolume(m_customVolume);
        }
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值