unity中关于VideoPlayer切换视频卡顿的解决方法与思路

博主是做安全教育行业的,在开发2d项目中经常会用到视频特效,如果用序列帧动画来做就会很耗内存,进入程序加载时间也会过长,如果用视频来代替这个消耗和加载就下降了一半还多,但是在开发过程中遇到了一个切换视频的bug,例如我现在有一个完整的动画特效,一个是不可循环的,一个是可以循环的,如果用一个视频播放器来播放,切换视频就会出现卡顿的现象,这个问题 我在网上找了好久没有发现比较好的解决方法,经过我个人研究解决了这个问题,废话不多说下面正式干货时间:
首先我们的美术人员给了我两个小的特效视频,不循环和可循环他们组合在一起就是一个完整的特效
在这里插入图片描述
正常来看我肯定要先播放第一个,等待第一个播放完毕在播放第二个,但是问题就出现了,在第一个播放完毕播放第二个的时候就会出现加载卡顿一下,这个时候我想到了用两个播放器同时加载两个视频,但是用同一个Render Texture在这里插入图片描述
在这里插入图片描述
第一个播放器用来加载不循环的视频
第二个播放器用来加载循环的视频
但是用同一个Render Texture
在第一个视频结束后添加委托事件,播放第二个视频代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using System;
public class sp : MonoBehaviour
{
    public static sp spins;
    public VideoClip []VideoClips;//视频源
    public VideoPlayer []VideoPlayers;//播放器
    public static Dictionary<string, VideoClip> 
    VideoClipslist = new Dictionary<string, VideoClip>();//用来方便调用视频源,你很可能有很多视频源
    VideoPlayer.EventHandler ve;//这个是给视频添加委托的必要,不然就会报错,可能有其他的解决方法,但是目前我没找到
    private void Awake()
    {
        spins = this;
        for (int i = 0; i < VideoClips.Length; i++)//这个就是把视频源添加到字典里面
        {
            VideoClipslist.Add(VideoClips[i].name, VideoClips[i]);
        }
        //重点来了
        ve = (a) => { VideoPlayers[1].Play(); };//把这个委托赋值,大括号内可以写你想让第一个视频播放完做的事情,我只是播放视频,所以就只写了一个视频播放的方法
        VideoPlayers[0].loopPointReached += ve;//这个就是把委托加入这个视频的事件内,
    }

第一步完成,下面这步就是要进入下级界面如何切换视频的问题代码如下

  void Start()
    {//这个是使用下面的方法
        Gy_sp2(VideoClipslist["首页不循环"],VideoClipslist["首页循环"],false,true);
        VideoPlayers[0].Play();
    }

//这个方法是把两个播放器清空然后预加载上新的视频
   public void Gy_sp2(VideoClip videoClip1, VideoClip videoClip2, bool isloop1,bool isloop2)//加载两个视频
    {
        VideoPlayers[0].Stop();
        VideoPlayers[1].Stop();
        VideoPlayers[0].clip = videoClip1;
        VideoPlayers[1].clip = videoClip2;
        VideoPlayers[0].isLooping = isloop1;
        VideoPlayers[1].isLooping = isloop2;
        VideoPlayers[0].Prepare();
        VideoPlayers[1].Prepare();   
    }

切换界面的时候只需要把所有RawImage都加入同一个Render Texture
在这里插入图片描述
在这里插入图片描述
在视频切换的时候调用这个方法就可以了,调用方法参考start里面的方法,只需要改一下视频源名称,切换一下ui,并加入一个过渡效果就完成了。
下面这个是一个扩展跟上一个差不多

  /// <summary>
     /// 切换加载视频也可以用这个
     /// </summary>
     /// <param name="_videoClip">视频源</param>
     /// <param name="_videoPlayer">播放器</param>
     /// <param name="_isloop">是否循环</param>
     /// <param name="_loopPointReached">在视频播放完后添加事件,这个事件只会执行一次</param>
    public void Gy_sp(VideoClip _videoClip, VideoPlayer _videoPlayer, bool _isloop = false, Action _loopPointReached = null)//加载一次
    {
        _videoPlayer.Stop();
        _videoPlayer.clip = _videoClip;
        _videoPlayer.isLooping = _isloop;
        _videoPlayer.Prepare();
        if (_loopPointReached != null)
        {
            VideoPlayer.EventHandler eventHandler = null;
            eventHandler = (a) =>
            {
                _loopPointReached();
                _videoPlayer.loopPointReached -= eventHandler;
            };
            _videoPlayer.loopPointReached += eventHandler;
        }      
    }

好了就到这里,本人第一次写,希望帮助到大家,如果转载请注明出处。

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
是的,UnityVideoPlayer组件在播放视频时可能会遇到卡顿的问题。这可能是由于视频文件本身的问题,也可能是由于设备性能不足或Unity项目的其他因素导致的。 下面是一些可能解决视频卡问题的方法: 1. 使用较低分辨率的视频文件:较高分辨率的视频文件可能需要更多的计算资源来解码和播放,因此选择较低分辨率的视频可以减少卡顿。 2. 优化视频编码格式:某些视频编码格式对设备性能要求更高,例如H.265。尝试使用更适合设备的编码格式,例如H.264。 3. 减少视频帧率:如果视频帧率过高,设备可能无法跟上播放速度,导致卡顿。尝试减少视频帧率,例如从60fps降低到30fps。 4. 避免同时播放多个视频:如果在同一时间播放多个视频,会增加设备负载,导致卡顿。确保只有一个视频正在播放。 5. 检查其他Unity项目资源:某些资源(例如高多边形模型、复杂的着色器)可能会占用大量计算资源,导致视频卡。尝试优化项目的其他资源以减少负载。 6. 使用硬件加速:某些设备支持硬件加速视频解码,可以通过启用硬件加速来提高播放性能。在VideoPlayer组件,可以将`videoPlayer.useHardwareDecoding`属性设置为`true`来启用硬件加速。 希望这些方法能帮助您解决视频卡的问题。如果问题仍然存在,请提供更多详细信息,以便更好地帮助您解决

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值