实现目的

有时我们需要播放一些待机动画,且动画能有轮廓不影响后面的界面。

way1:

我们会使用带通道的动画帧序列,通常情况,二维美术做好动画,输出几百张序列帧我们导入使用(创建动画状态机加载,或者代码加载sprite)。

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_下载地址


way2:

做完视频做遮罩,但是遮罩只能是一张图,不会随着视频内容变化而变化。

我们会发现弊端:序列帧非常多时,渲染很占性能和资源,fps时常低到个位数,卡到不能看!想去做性能优化,小项目上可谓是南辕北辙,耗时耗力。

优化、解决方式

采用透明视频:格式webm,ogv

实现方法

1.序列帧命名规范化:

文件夹及文件不能有中文字符,推荐一款批量命名工具:ReNamer,下载地址 不规范命名案例:

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_ide_02


修改文件夹名称为英文;

打开ReNamer如下设置:

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_下载地址_03


android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_下载地址_04


完成重命名。2.下载转换工具ffmpeg,下载地址 3.开始转换webm透明视频

打开cmd窗口,不需要管理员方式打开。不知道cmd的,请去百度。

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_序列帧_05


输入:“ -i 图片所在文件夹绝对路径\图片名前缀+%第一张图的序号位数d.png -auto-alt-ref 0 -c:v libvpx -r 帧率 -b:v 1000k 输出路径文件夹名称\视频名.webm”(引号不要复制,如果第一张图为rw_00001则填写rw_%5d.png输出路径不能在C盘根目录,因为没权限,可以是桌面的路径。),命令下载地址

参考:C:\Users\GK\Desktop\ffmpeg\bin\ffmpeg.exe -i C:\Users\GK\Des

ktop\renwu\rw_%4d.png -auto-alt-ref 0 -c:v libvpx -r 25 -b:v 1000k C:\Users\GK\D

esktop\ffmpeg\v.webm

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_下载地址_06


出现如下界面就成功了

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_序列帧_07


android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_ide_08


制作完成。

来看一下输出后的大小吗,可以再去对比一下本文第一张图

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_序列帧_09

Untiy中使用

way1:按照图示选择设置透明视频。我采用RawImage成像播放视频,必须设置VP8模式,不然颜色不对。

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_下载地址_10


android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_序列帧_11


下面献上珍藏多年的视频播放代码

播放代码

using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class VideoControl : MonoBehaviour
{
    private VideoPlayer Vp;
    private RawImage RawImg;

    void Awake()
    {
        Vp = GetComponent<VideoPlayer>();
        RawImg = GetComponent<RawImage>();
        Vp.isLooping = true;
    }

    void OnEnable()
    {
        RawImg.color = new Color(1, 1, 1, 0);
        Vp.Play();
        Vp.loopPointReached += VideoEnd;
    }

    void VideoEnd(VideoPlayer vp)
    {
        Vp.Play();

    }

    void Update()
    {
        if (Vp.frame > 0)
        {
            RawImg.color = new Color(1, 1, 1, 1);
            RawImg.texture = Vp.texture;
        }
        else
        {
            //RawImg.color=new Color(1,1,1,0);
        }
    }

    void OnDisable()
    {
        RawImg.color = new Color(1, 1, 1, 0);
        Vp.Stop();
    }
}

播放时会发现如丝版的fps6666

拜了个拜

其他播放方式:

way2:比如创建一个3D面片,设置一个材质球,选一下渲染模式看图。这个不需要代码控制播放,直接就能放了

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_序列帧_12

way3:

调整videoplayer的渲染模式,这个也不需要代码控制播放

android利用透明视频和alpha视频实现多层视频叠加 视频透明图层_下载地址_13

各有利弊,自行定夺!