AVProVideo插件学习笔记

视频控制类脚本,可实现多视频切换,播放、暂停、控制视频进度、视频音量、显示视频提示信息等功能
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RenderHeads.Media.AVProVideo;
using UnityEngine.UI;
/// <summary>
/// 视频控制类
/// </summary>
public class My_VideoController : MonoBehaviour
{
    [Header("视频播放器")]
    public MediaPlayer _mediaPlayer_A;
    public MediaPlayer _mediaPlayer_B;
    public MediaPlayer _mediaPlayer_C;
    //当前播放器
    private MediaPlayer PlayingPlayer;
    //当前加载的视频播放器
    private MediaPlayer _loadingPlayer;

    [Header("视频显示器")]
    public DisplayUGUI _avProVideo;

    [Header("视频进度条")]
    public Slider _videoSeekSlider;
    [Header("视频时间显示文本")]
    public Text VideoTime_Text;
    [Header("播放/暂停按钮")]
    public Button Play_Button;
    private bool isFirstClick_PlayButton;
    [Header("上一个视频按钮")]
    public Button Last_Button;
    [Header("下一个视频按钮")]
    public Button Next_Button;
    [Header("视频音量滑动条")]
    public Slider AudioVolumeSlider;
    //存储静音状态前用户设置的音量
    private float _customVolume;
    [Header("静音开关")]
    public Toggle _muteToggle;
    [Header("提示文本")]
    public Text Tip_Txt;

    [Header("视频路径的获取方式")]
    public MediaPlayer.FileLocation _location = MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder;
    [Header("视频路径的前半段")]
    public string _folder = "AVProVideoSamples/";

    [Header("视频路径")]
    public string[] _videoFiles = { "BigBuckBunny_720p30.mp4", "SampleSphere.mp4", "Sample180.mp4" };
    //视频索引
    private int _VideoIndex = 0;

    private void Awake()
    {
        //开始默认播放器为_mediaPlayer_A
        PlayingPlayer = _mediaPlayer_A;
        _loadingPlayer = _mediaPlayer_B;
        //播放默认视频
        PlayingPlayer.m_VideoPath = System.IO.Path.Combine(_folder, _videoFiles[_VideoIndex]);
        PlayingPlayer.OpenVideoFromFile(_location, PlayingPlayer.m_VideoPath, true);
    }
    // Start is called before the first frame update
    void Start()
    {
        //监听视频播放进度条值改变触发事件
        _videoSeekSlider.onValueChanged.AddListener(this.On_videoSeekSlider_Change);
        //监听播放上一个视频按钮点击事件
        Last_Button.onClick.AddListener(() => { Click_Last_or_Next_Button(Last_Button); });
        //监听播放下一个视频按钮点击事件
        Next_Button.onClick.AddListener(() => { Click_Last_or_Next_Button(Next_Button); });
        //监听音量滑动条值改变触发事件
        AudioVolumeSlider.onValueChanged.AddListener(this.On_AudioVolumeSlider_Change);
        //监听静音开关事件
        _muteToggle.onValueChanged.AddListener(this.OnMuteToggleClick);
        //监听播放/暂停按钮点击事件
        Play_Button.onClick.AddListener(this.Click_PlayOrPause_Button);
    }

    // Update is called once per frame
    void Update()
    {
        //时刻更新视频进度到滑动条上
        DoUpdate_VideoProcess();
        //更新播放进度的时间显示
        UpdateTimeText();
    }

    /// <summary>
    /// 视频播放进度条值改变触发
    /// </summary>
    /// <param name="value"></param>
    private void On_videoSeekSlider_Change(float value)
    {
        //获取视频总长度
        float tVideoTime = PlayingPlayer.Info.GetDurationMs();
        //当前视频的时间
        float tCurrentTime = _videoSeekSlider.value * tVideoTime;
        //将视频时间调到对应的节点
        PlayingPlayer.Control.Seek(tCurrentTime);
    }
    /// <summary>
    /// 播放进度条开始拖动触发(EventTrigger触发)
    /// </summary>
    public void On_videoSeekSlider_DragBegin()
    {
        //暂停播放
        PlayingPlayer.Control.Pause();
    }
    /// <summary>
    /// 播放进度条结束拖动触发(EventTrigger触发)
    /// </summary>
    public void On_videoSeekSlider_DragEnd()
    {
        //开始播放
        PlayingPlayer.Control.Play();
    }
    /// <summary>
    /// 时刻更新视频进度到滑动条上
    /// </summary>
    private void DoUpdate_VideoProcess()
    {
        //获取当前播放时长
        float tCurrentTime = PlayingPlayer.Control.GetCurrentTimeMs();
        //获取视频总长度
        float tVideoTime = PlayingPlayer.Info.GetDurationMs();
        //计算出对应的播放进度赋值给显示播放进度的进度条
        if (tVideoTime > 0)
        {
            _videoSeekSlider.value = tCurrentTime / tVideoTime;
        }
    }
    /// <summary>
    /// 更新播放进度的时间显示
    /// </summary>
    private void UpdateTimeText()
    {
        //对当前播放时间转换时间格式
        //转化为 秒
        int tCurrentSeconds = (int)PlayingPlayer.Control.GetCurrentTimeMs() / 1000;
        //获取当前分数
        int tCurrentMin = tCurrentSeconds / 60;
        //重新赋值剩余多少秒
        tCurrentSeconds = tCurrentSeconds % 60;
        string tCurrentSecondStr = tCurrentSeconds < 10 ? "0" + tCurrentSeconds : tCurrentSeconds.ToString();

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

        //拼接一下时间显示字符串
        string tTime = string.Format("<color=white>{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);

        VideoTime_Text.text = tTime;
    }
    private void Click_Last_or_Next_Button(Button btn)
    {
        if (btn == Last_Button)
        {
            if (_VideoIndex >= 1 && _VideoIndex <= 2)
            {
                _VideoIndex--;
                OnOpenVideoFile();
            }
            else
            {
                Tip_Txt.gameObject.SetActive(true);
                Tip_Txt.text = "前面已经没有视频了!!!";
                Invoke("Hide_Tip_Txt", 1.5f);
            }
        }
        else if (btn == Next_Button)
        {
            if (_VideoIndex >= 0 && _VideoIndex <= 1)
            {
                _VideoIndex++;
                OnOpenVideoFile();
            }
            else
            {
                Tip_Txt.gameObject.SetActive(true);
                Tip_Txt.text = "后面已经没有视频了!!!";
                Invoke("Hide_Tip_Txt", 1.5f);
            }
        }
    }
    private void OnOpenVideoFile()
    {
        //print("当前的视频索引号:" + _VideoIndex);
        if (_VideoIndex == 0)
        {
            _loadingPlayer = _mediaPlayer_B;
        }
        else if (_VideoIndex == 1)
        {
            _loadingPlayer = _mediaPlayer_C;
        }
        else if (_VideoIndex == 2)
        {
            _loadingPlayer = _mediaPlayer_A;
        }
        _loadingPlayer.m_VideoPath = System.IO.Path.Combine(_folder, _videoFiles[_VideoIndex]);
        _loadingPlayer.OpenVideoFromFile(_location, _loadingPlayer.m_VideoPath, true);

        // 更改显示的视频为正在播放的视频
        PlayingPlayer = _loadingPlayer;
        _avProVideo.CurrentMediaPlayer = PlayingPlayer;
    }
    /// <summary>
    /// 隐藏提示文本的方法
    /// </summary>
    private void Hide_Tip_Txt()
    {
        Tip_Txt.gameObject.SetActive(false);
    }
    /// <summary>
    /// 音量进度条改变触发
    /// </summary>
    /// <param name="value"></param>
    private void On_AudioVolumeSlider_Change(float value)
    {
        //保存当前已经设置的音量
        if (value != 0)
        {
            _customVolume = AudioVolumeSlider.value;
        }
        //设置音量
        PlayingPlayer.Control.SetVolume(value);
        //如果音量手动调节到零,则将静音模式打开
        if (value > 0)
        {
            _muteToggle.isOn = false;
        }
        else
        {
            _muteToggle.isOn = true;
        }
    }
    /// <summary>
    /// 静音开关触发
    /// </summary>
    /// <param name="s_isOn"></param>
    private void OnMuteToggleClick(bool s_isOn)
    {
        //如果静音
        if (s_isOn)
        {
            //设置静音
            AudioVolumeSlider.value = 0;
            PlayingPlayer.Control.SetVolume(0);
        }
        //不静音
        else
        {
            AudioVolumeSlider.value = _customVolume;
            PlayingPlayer.Control.SetVolume(_customVolume);
        }
    }
    /// <summary>
    /// 播放与暂停开关点击触发
    /// </summary>
    /// <param name="s_isOn"></param>
    private void Click_PlayOrPause_Button()
    {
        //如果第一次点击按钮就播放
        if (isFirstClick_PlayButton)
        {
            isFirstClick_PlayButton = false;
            PlayingPlayer.Control.Play();
            Play_Button.transform.GetChild(0).GetComponent<Text>().text = "播放";
        }
        //否则,暂停
        else
        {
            isFirstClick_PlayButton = true;
            PlayingPlayer.Control.Pause();
            //更改播放开关显示的文字
            Play_Button.transform.GetChild(0).GetComponent<Text>().text = "暂停";
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值