Unity-WebGL加载StreamingAssets下的视频

一、加载单个视频

最基础代码,使用UnityWebRequest加载StreamingAssets文件下的单个视频文件


    private VideoPlayer videoPlayer;    //播放视频组件
    private string videoFolder;         //视频文件地址


    void Start()
    {
        //获取VideoPlayer组件
        videoPlayer = GetComponent<VideoPlayer>();

        //如果测试视频.mp4是在StreamingAssets文件下的extern_resource文件下
        videoFolder = Path.Combine(Application.streamingAssetsPath, "extern_resource/测试视频.mp4");
        //如果测试视频.mp4是在StreamingAssets文件下的
        //videoFolder = Path.Combine(Application.streamingAssetsPath, "测试视频.mp4");
    }

    //启动方法
    void PlayVideo()
    {
        StartCoroutine(LoadVideo(videoFolder));
    }

    IEnumerator LoadVideo(string path)
    {
        using (var unitywebrequest = new UnityWebRequest(path))
        {
           
            unitywebrequest.downloadHandler = new DownloadHandlerBuffer();
            yield return unitywebrequest.SendWebRequest();
            if (unitywebrequest.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError("视频加载失败:" + unitywebrequest.error);
            }
            else
            {
                videoPlayer.url = unitywebrequest.url;
                videoPlayer.Pause();
                videoPlayer.Play();
            }
        }
    }

基础方法只能提前在代码中写死视频名称进行加载,并且只能加载单个视频,如果要手动替换文件夹里的视频或者加载多个就不适用了。

二、加载多个视频

那么接下来我们在此基础上进行修改,修改为可以动态加载,可以手动替换StreamingAssets文件夹下的视频,或者加载多个视频。如下图所示。根据视频数量和名称生成对应的按钮,点击按钮切换视频。

经测试

1、如果是直接加载打包出index.html文件,可以通过相对路径动态加载StreamingAssets文件下的视频。通过txt可以获取视频名称,后续来拼接地址进行加载。

创建txt命名为VideoList.txt放到StreamingAssets下,把你要加载的视频名称写入到里面。

.

2、如果是把导出的webgl嵌套到前端里,通过前端代码来加载场景,就无法通过相对路径加载出StreamingAssets文件下的视频,可以把视频文件夹放到阿里云上或者腾讯云上加载,所以我们还要动态获取视频文件的路径才可以。

创建一个josn文件放到StreamingAssets文件下,命名为VideoInfo.json

代码如下 


    private VideoPlayer videoPlayer;    //播放视频组件
    private string videoFolder;         //视频文件地址
    private string videoInfoPath;       //外部视频文件信息
    private string[] videoNames;        //视频文件名称(拼接地址使用)

    void Start()
    {
        videoPlayer = UIVideo.transform.GetChild(0).GetComponent<VideoPlayer>();

        //上述的第一种实现(直接打开index.html)
        videoFolder =Path.Combine(Application.streamingAssetsPath,"extern_resource");
        StartCoroutine(LoadVideoList());

        //上述的第二种实现(嵌套到前端里,通过前端代码打开)
        //StartCoroutine(LoadVideoInfo());

        
       //这里我们已经得到了所有视频的名称,想要什么效果就自己了,如点击按钮切换视频或者上下键切换视频
       //也可以加载所有视频了,调用WebLoadVideo()参数就是视频名就可以了
       //调用时要去掉首尾空格,否则地址会拼接错误  如:WebLoadVideo(videoNames[0].Trim())
       //todo.......
        
        }
    }

    //打开视频面板
    public void OpenVideoPanel()
    {
        WebLoadVideo(videoNames[0].Trim());//打开面板默认播放第一个视频         
    }

    //加载txt文件
    IEnumerator LoadVideoList()
    {
        jsonPath = Application.streamingAssetsPath + "/VideoList.txt";
        UnityWebRequest request = UnityWebRequest.Get(jsonPath);
        yield return request.SendWebRequest();
        if (request.result == UnityWebRequest.Result.Success)
        {
            string jsonContent = request.downloadHandler.text;
            videoNames = jsonContent .Split(',');//分割开并存到数组里
        }      
    }


    //加载json文件      (可以看我曾经发过的文章)
    IEnumerator LoadVideoInfo()
    {
        jsonPath = Application.streamingAssetsPath + "/VideoInfo.json";
        UnityWebRequest request = UnityWebRequest.Get(jsonPath);
        yield return request.SendWebRequest();
        if (request.result == UnityWebRequest.Result.Success)
        {
            string jsonContent = request.downloadHandler.text;
            Root root = JsonUtility.FromJson<Root>(jsonContent);
            videoFolder = root.URL;
            videoNames = root.VideoNames;
        }
    }

    
    //加载视频
    public void WebLoadVideo(string videoName)//参数是视频名称 如 测试.mp4
    {
        StartCoroutine(LoadVideo(Path.Combine(videoFolder, videoName)));
    }
    IEnumerator LoadVideo(string path)
    {
        using (var unitywebrequest = new UnityWebRequest(path))
        {
            unitywebrequest.downloadHandler = new DownloadHandlerBuffer();
            yield return unitywebrequest.SendWebRequest();
            if (unitywebrequest.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError("视频加载失败:" + unitywebrequest.error);
            }
            else
            {
                videoPlayer.url = unitywebrequest.url;
                videoPlayer.Pause();
                videoPlayer.Play();
            }
        }
    }

    //关闭视频面板
    public void ClosePanel()
    {
        videoPanel.SetActive(false);
        videoPlayer.Pause();
    }

    //定义json实体类
    [System.Serializable]
    public class Root
    {
        public string URL;
        public List<string> VideoNames;
    }

切记!!!如果手动修改视频路径文件下的视频,记得去修改txt里的视频名称,这两个要同步才可以。上述两种加载方法代码均使用于PC端

主要思路就是上述写的,其他拓展功能大家自行开发。发现问题及时留言,我们一起讨论一起进步。

Unity中,要将项目打包成WebGL并读取`StreamingAssets`目录下的数据,你需要确保你的资源已经被设置为`Streaming Asset`,因为这些文件不会随着预设包一起下载,而是会在用户首次加载时动态加载。以下是一个简单的代码示例,说明如何在运行时通过JavaScript访问`StreamingAssets`路径: ```javascript // 获取Unity安装目录下 StreamingAssets 的路径 var streamingAssetsPath = application.dataUrl + "StreamingAssets/"; function loadStreamingAsset(assetName) { var url = streamingAssetsPath + assetName; // 创建一个新的 XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); // 设置请求类型和回调函数 xhr.open("GET", url, true); xhr.responseType = 'arraybuffer'; // 需要设置响应类型为ArrayBuffer // 请求完成后的处理函数 xhr.onload = function() { if (xhr.status === 200) { // 确保请求成功 var arrayBuffer = xhr.response; // 获取到二进制数据 // 这里你可以进一步解析arrayBuffer,例如转换为Text或Blob对象 parseArrayBuffer(arrayBuffer); // 自定义的解析函数 } else { console.error("Failed to load Streaming Assets data: " + xhr.statusText); } }; // 发送请求 xhr.send(); } // 示例:加载图片 loadStreamingAsset('path/to/image.png'); ``` 在这个例子中,`loadStreamingAsset`函数会尝试从指定路径下载资产,并在加载完成后执行自定义的解析函数`parseArrayBuffer`。记得替换`assetName`为你需要的`StreamingAssets`中的实际资源名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值