AVProVideo插件实现文件夹中的视频文件循环播放

说明:


最近项目需要循环播放一个视频列表,使用的是【AVProVideo插件】,发现只能一个视频的循环播放,不能实现一个文件夹下的所有视频的循环播放。


解决如下:
插件下载 提取码:bdgh
AVProVideo插件实现文件夹中的视频文件循环播放_第1张图片
根据上图所示声明一个事件方法,形参与之对应。为MediaPlayer添加事件,这里实现的是当前视频播放完成后,在【FinishedPlaying】里实现播放下一个视频的逻辑。
补充说明:在切换视频时,会看到UI后面的界面,可以在AVPro Video下的【Display UGUI】组件上设置默认纹理,我这里设置的时【 displayUGUI.color】,在播完完当前视频后(FinishedPlaying)颜色设为黑色,在第一帧准备完成后(FirstFrameReady)颜色设为白色

 public void OnAddEvents(MediaPlayer mp,MediaPlayerEvent.EventType eventType,ErrorCode errorCode)
    {
        switch (eventType)
        {
            case MediaPlayerEvent.EventType.MetaDataReady:
                break;
            case MediaPlayerEvent.EventType.ReadyToPlay:
                print("ReadyToPlay状态");
                break;
            case MediaPlayerEvent.EventType.Started:
                print("Started状态");
                break;
            case MediaPlayerEvent.EventType.FirstFrameReady:
                print("第一帧准备完成");
                if (displayUGUI != null)
                    displayUGUI.color = new Color(255, 255, 255);
                break;
            case MediaPlayerEvent.EventType.FinishedPlaying:
                print("完成当前的视频播放");
                videoIndex++;  

                if (videoIndex>=videoCount)
                    videoIndex = 0;
                
                displayUGUI.color = new Color(0, 0, 0);

                mp.m_VideoPath = videoPaths[videoIndex];
                mp.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, mp.m_VideoPath);
                break;
            default:
                break;
        }
    }

MediaPlayerEvent.EventType 枚举类型如下,可以自行了解
AVProVideo插件实现文件夹中的视频文件循环播放_第2张图片
以上已经实现了当前视频播放完后播放下一个视频的逻辑,所以我们需要有一个视频列表,在播放完当前,将播放地址更换为下一个。

/// 
    /// 获取视频路径
    /// 
    /// 视频的根文件夹
    /// 后缀
    /// 存放路径的列表
    private void GetVideoList(string path,string suffix,ref List<string> videoLists)
    {
        string videoName;
        DirectoryInfo dir = new DirectoryInfo(path);
        FileInfo[] fileInfo = dir.GetFiles();

        foreach (FileInfo item in fileInfo)
        {
            videoName = item.FullName;
            //print(fileName);
            if (videoName.EndsWith(suffix))
            {
                //添加到列表中
                videoLists.Add(videoName);
                print("当前添加到列表中的路径为"+videoName);
            }
        }
    }

完整脚本如下:


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

/// 
/// 控制视频的循环播放
/// 
public class VideoLoop : MonoBehaviour
{
    private int videoIndex;    //播放视频的索引
    private int videoCount;    //视频数量

    private MediaPlayer mediaPlayer;
    private DisplayUGUI displayUGUI;

    //当前的视频播放列表
    private List<string> videoPaths = new List<string>();
    string videoRootPath;

    string path;
    private void Awake()
    {
        videoRootPath = Application.streamingAssetsPath + "/Video";

        GetVideoList(videoRootPath, "mp4", ref videoPaths);
        videoCount = videoPaths.Count;
    }
    void Start()
    {
        videoIndex=0;
        
        displayUGUI = GameObject.Find("AVPro Video").GetComponent<DisplayUGUI>();
        mediaPlayer = transform.GetComponent<MediaPlayer>();
        InitPlay();
    }

    //初始化 默认播放第一个
    private void InitPlay()
    {
        if (videoCount>0)
             path = videoPaths[0];
        mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, path);
    }
 
    public void OnAddEvents(MediaPlayer mp,MediaPlayerEvent.EventType eventType,ErrorCode errorCode)
    {
        switch (eventType)
        {
            case MediaPlayerEvent.EventType.MetaDataReady:
                break;
            case MediaPlayerEvent.EventType.ReadyToPlay:
                print("ReadyToPlay状态");
                break;
            case MediaPlayerEvent.EventType.Started:
                print("Started状态");
                break;
            case MediaPlayerEvent.EventType.FirstFrameReady:
                print("第一帧准备完成"); 
                if (displayUGUI != null)
                    displayUGUI.color = new Color(255, 255, 255);
                break;
            case MediaPlayerEvent.EventType.FinishedPlaying:
                print("完成当前的视频播放");
                videoIndex++;  

                if (videoIndex>=videoCount)
                    videoIndex = 0;
                
                displayUGUI.color = new Color(0, 0, 0);

                mp.m_VideoPath = videoPaths[videoIndex];
                mp.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, mp.m_VideoPath);
                break;
            default:
                break;
        }
    }

    /// 
    /// 获取视频路径
    /// 
    /// 视频的根文件夹
    /// 后缀
    /// 存放路径的列表
    private void GetVideoList(string path,string suffix,ref List<string> videoLists)
    {
        string videoName;
        DirectoryInfo dir = new DirectoryInfo(path);
        FileInfo[] fileInfo = dir.GetFiles();

        foreach (FileInfo item in fileInfo)
        {
            videoName = item.FullName;
            //print(fileName);
            if (videoName.EndsWith(suffix))
            {
                //添加到列表中
                videoLists.Add(videoName);
                print("当前添加到列表中的路径为"+videoName);
            }
        }
    }
}

你可能感兴趣的:(Unity功能脚本,unity3d,c#)