用unity插件AVProVideo制作一个视频播放器

一:界面展示

功能键有:播放/暂停,是否循环播放,音量控制,倍速控制,视频切换,后退前进,显示时间。

二:unity面板

将对应内容拖到对应位置即可。

三:代码

using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class VideoController : MonoBehaviour
{
  
     //持有控制视频播放的组件
     public MediaPlayer mediaPlayer;
 
     //持有播放暂停切换开关
     public Toggle m_videoToggle;
 
     //持有是否循环播放开关
     public Toggle m_loopToggle;
 
     //持有控制播放速度的下拉列表
     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;

    //切换为上一个视频,下一个视频
    public Button lastBtn;  
    public Button nextBtn;

    [Header("视频名称")]
    string[] VideoNames;

    //初始化
    void Awake()
     {
        //视频名称的路径
        VideoNames = File.ReadAllLines(Application.streamingAssetsPath + "/name.txt");

        #region 事件监听
        //注册播放暂停开关事件
        m_videoToggle.onValueChanged.AddListener(DoPlayOrPause);
         //注册是否循环播放开关事件
         m_loopToggle.onValueChanged.AddListener(DoSetLoop);
         //注册控制速度的滚动天触发事件
        
         //添加下拉列表选项
         m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "2倍速"));
         m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "1.5倍速"));
         m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "1倍速"));
         m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "0.5倍"));

         //设置初始速度显示值,默认为1倍速
         m_playSpeedDropdown.value = 2;
         m_playSpeedDropdown.captionText.text = m_playSpeedDropdown.options[2].text;

         //注册控制速度的下拉列表触发事件
         m_playSpeedDropdown.onValueChanged.AddListener(DoChangeSpeed);
 
         //注册视频播放进度条值改变触发事件
         m_processSlider.onValueChanged.AddListener(OnProcessSliderChange);
 
         //注册返回n几秒前按钮触发事件
         m_backSecondsBtn.onClick.AddListener(OnBackSecondsClick);
 
         //注册音量Slider事件
         m_volumeSlider.onValueChanged.AddListener(OnVolumeSliderChange);
         //注册静音开关事件
         m_muteToggle.onValueChanged.AddListener(OnMuteToggleClick);
 
         //注册视频播放触发事件
         mediaPlayer.Events.AddListener(MediaEventHandler);

        //上一个按钮监听
        lastBtn.onClick.AddListener(LastVideo);
        //下一个按钮监听
        nextBtn.onClick.AddListener(NextVideo);
        #endregion
    }

    // 视频播放时间触发
    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 :
                 break;
         }
     }
 
     void Start ()
     {
         LoadVideo();
 
         //初始化触发一次(同步声音大小)
         OnVolumeSliderChange(m_volumeSlider .value);
     }
 
     void Update()
     {
         //时刻更新播放进度方法
         DoUpdateVideoProcess();
 
         //时刻更新播放时间显示方法
         UpdateTimeText();
     }

    // 加载视频方法
    int index = 0;
    void LoadVideo()
     {
         //通过插件中的方法加载(参数为:1.加载路径格式(与面板上相对应)2.加载的文件名 3.默认是否开始播放)
         mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, VideoNames[index] + ".mp4", true);
     }

    #region 视频切换

    // 下一个视频
    void NextVideo()
    {
        index++;
        if (index > VideoNames.Length - 1)
            index = 0;
        //视频播放
        LoadVideo();
    }

    // 上一个视频
    void LastVideo()
    {
        index--;
        if (index<0)
            index = VideoNames.Length - 1;
        //视频播放
        LoadVideo();
    }

    #endregion

    #region 视频播放、暂停、循环
    // 播放与暂停开关点击触发
    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 = "播放";
         }
     }

     // 是否循环播放开关点击触发
     void DoSetLoop(bool s_isOn)
     {
         //通过持有的MediaPlayer类进行操控
         mediaPlayer.Control.SetLooping(s_isOn);
     }
    #endregion

    #region 倍速
    // 改变播放速度方法(正的加速放映,负的倒放映)
    void DoChangeSpeed(int s_speed)//下拉列表对应索引值
     {
         float tSpeed = 1;
         switch (s_speed)
         {
             case 0:
                 tSpeed = 2;
                 break;
             case 1:
                 tSpeed = 1.5f;
                 break;
             case 2:
                 tSpeed = 1;
                 break;
             case 3:
                 tSpeed = 0.5f;
                 break;
             
             default :
                 Debug.Assert(false);
                 break;
         }
         mediaPlayer.Control.SetPlaybackRate(tSpeed);
     }
    #endregion

    #region 进度条
    // 时刻更新视频进度到滑动条上
    void DoUpdateVideoProcess()
     {
         //获取当前播放时长
         float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
         //获取视频总长度
         float tVideoTime = mediaPlayer.Info.GetDurationMs();
         //计算出对应的播放进度赋值给显示播放进度的进度条
         m_processSlider.value = tCurrentTime/tVideoTime;
     }
 
     // 更新播放进度的时间显示
     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=black>{0}:{1}/{2}:{3}</color>", tCurrentMin, tCurrentSecondStr, tVideoTimeMin, tVideoTimeSecondStr);
 
         m_videoTimeTex.text =  tTime ;;
     }
 
     // 视频播放进度条值改变触发
     void OnProcessSliderChange(float value)
     {
         //获取视频总长度
         float tVideoTime = mediaPlayer.Info.GetDurationMs();
         //当前视频的时间
         float tCurrentTime = m_processSlider.value*tVideoTime;
         //将视频时间调到对应的节点
         mediaPlayer.Control.Seek(tCurrentTime);

        m_processSlider.transform.Find("Fill Area").Find("Fill").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
        m_processSlider.transform.Find("Handle Slide Area").Find("Handle").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
     }
 
 
     // 播放进度条开始拖动触发(EventTrigger触发)
     public void OnProcessSliderDragBegin()
     {
         //暂停播放
         mediaPlayer.Control.Pause();
     }
 
     // 播放进度条结束拖动触发(EventTrigger触发)
     public void OnProcessSliderDragEnd()
     {
         //开始播放
         mediaPlayer.Control.Play();
     }
 
     // 返回到几秒之前方法
     void OnBackSecondsClick()
     {
         //获取当前播放进度时间
         float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
 
         //10s前进度时间(如果存在前十秒则退,不存在还是当前时间进度)
         tCurrentTime = (tCurrentTime - m_backSeconds * 1000) >= 0 ? tCurrentTime - m_backSeconds*1000 : tCurrentTime;
 
         //设置进度时间
         mediaPlayer.Control.Seek(tCurrentTime);
     }
    #endregion

    #region 音量设置

    // 音量进度条改变触发
    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;
         }
     }
 
     // 静音开关触发
     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);
         }
     }
    #endregion

}

其中视频存放在streamingAssets文件夹中,视频名称存放在一个名为“name”的txt文件中,通过读取name中视频的名称控制上一个,下一个视频的播放。

四:程序包

链接:https://pan.baidu.com/s/1A3L3lMaJFHrK2lIGD13NWA?pwd=jl98

提取码:jl98

猜你喜欢

转载自blog.csdn.net/shijinlinaaa/article/details/129751885
今日推荐