视频播放插件AVPro1-插件介绍

Posted Unity新人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频播放插件AVPro1-插件介绍相关的知识,希望对你有一定的参考价值。

官方地址:Introduction | AVPro Video - Documentation

注:如果打开,没有选项栏,换个浏览器试试。

(1).UserManual,FAQ,ReleaseNote:用户手册、常见问题解答、发行通知,点击进入网址:Introduction | AVPro Video - Documentation

(2).Script Class Referebce:脚本类查询,点击进入网址:Namespace RenderHeads.Media.AVProVideo | AVPro Video - Documentation

一、介绍

AVPro Video是由RenderHeads创建的一个强大的Unity跨平台视频播放插件

我们创建这个插件主要是为了与我们的内部项目一起使用。在 RenderHeads,我们为博物馆的活动和教育游戏创建互动装置,因此视频播放是我们工作的一个重要方面。我们发现 Unity 中的内置视频功能无法满足我们的许多用例,因此自 2012 年以来,我们一直在为 Unity 构建视频相关插件。

AVPro Video 是一系列视频播放插件中的最新款,它利用了它支持的不同平台的特定功能,同时易于使用且性能卓越。

二、特征

特点总结:

  • 兼容性
    • 支持 Unity 2018.x - 2021.x 及更高版本
    • 跨平台版本,适用于 ios、tvOS、macOS、android、Windows、UWP
    • Unity 的 VideoPlayer 的可选回退(即将推出)
    • 不受支持的平台的优雅回退
  • 便于使用
    • 一个 API 适用于所有支持的平台
    • 易于使用,拖放组件
    • 可编写脚本的 API
  • 强大的功能
    • 播放本地文件、URL 文件和自适应流格式
    • VR 支持(单声道、立体、等距矩形和立方体贴图)
    • 透明度支持(原生和打包)
    • 支持线性和伽玛色彩空间
    • 8K 视频支持(在支持的硬件上)
    • 流式比特率控制(即将推出)
  • 高级功能
    • 通过 AES HLS 加密视频播放
    • 用于安全播放的自定义 HTTP 标头
    • 支持 Hap、Hap Alpha、Hap Q 和 Hap Q Alpha 等行业编解码器(支持 16K+)
  • 高度优化
    • GPU视频解码
    • 优化的原生 Direct3D、OpenGL 和 Metal 支持
    • 专注于最少的垃圾产生
  • 可扩展
    • 用于 IMGUI、Unity UI 的组件(以后可能还有 NGUI)
    • 时间线/可播放项目、着色器图、视觉效果图的组件
    • 支持 SRP (URP / HDRP)
  • 很好支持

三、资产文件

AVPro 视频资产包包含组织成 5 个主要文件夹的文件:

  1. 运行时文件夹
  2. 扩展文件夹
  3. 演示文件夹
  4. 编辑器文件夹
  5. 流资产文件夹

1.演示文件夹(Demos)

此文件夹包含几个示例场景,展示了如何使用 AVPro Video 中包含的一些组件。此文件夹构建到它自己的程序集并且是可选的。

(1).媒体播放器界面(Common/MediaPlayerUI)

用于媒体播放的功能齐全的高级 UI 的完整脚本和着色器。

(2).样本媒体(SampleMedia)

示例媒体的 MediaReference 资产文件(本地文件和流 URL)

(3).场景/Demo_360Stereo.unity(Scenes/Demo_360Stereo)

一个示例场景,显示应用于球体的 360 equirectangular 立体视频。

(4).场景/Demo_DisplayComponents.unity(Scenes/Demo_DisplayComponents)

一个示例场景,展示了用于显示和操作视频的所有不同组件。

(5).场景/Demo_MediaPlayer.unity(Scenes/Demo_MediaPlayer)

使用 AVPro Video 播放媒体并使用 MediaPlayerUI 帮助演示字幕、搜索、Unity 音频、流媒体等功能的综合示例场景。

(6).场景/Demo_Demo_Playlist.unity(Scenes/Demo_Playlist)

一个示例场景,展示了用于多个视频之间切换,有切换效果。

2.编辑器文件夹(Editor)

此文件夹包含用户通常不会修改的仅限编辑器的脚本。它构建到 AVProVideo.Editor 程序集。

3.扩展文件夹(Extensions)

此文件夹包含用于支持其他包、Unity 扩展或其他资产的文件。

(1).时间线(Timeline)

添加对 Playables 时间轴功能的支持

(2).UnityUI(UnityUI)

向 Unity 的 UI 系统添加对显示视频的支持

(3).视觉效果图(VisualEffectGraph)

添加对将视频发送到 Unity 的 VFX 图表的支持

4.运行时文件夹(Runtime)

此文件夹包含 AVPro Video 的主要元素。它构建到 AVProVideo.Runtime 程序集。

(1).插件(Plugins)

包含所有本机插件文件

(2).资源/纹理(Resources)

NullMediaPlayer 使用并始终包含在构建中的纹理

(3).脚本(Scripts)

  • 资产类型(AssetTypes)

用于定义媒体的 ScriptableObject

  • 成分(Components)

单一行为组件

  • 内部的(Internal)

用户通常不会修改的内部代码

(4).着色器(Shaders)

此基本文件夹包含所有可选着色器,如果不使用它们将被删除。它还包含所有着色器共享的重要 .cginc 文件

  • 资源

始终包含在构建中的内部着色器

5.流资产文件夹(StreamingAssets)

此文件夹包含示例媒体文件,这些文件用于演示场景所依赖的演示目的。

包含的 AVProVideoSamples 子文件夹是可选的,仅用于我们的演示场景。

 

Unity 视频播放

Unity 视频播放

前言

在Unity引擎做视频播放的方式有很多种,这里介绍两种。一种是使用RawImage组件的纹理进行视频播放,将视频每一帧的画面复制在RawImage的纹理贴图中,实现视频的播放展示;另外一种是使用插件Av Pro进行视频的播放,在此次的案例中我使用的是AVProVideo1.9.6版本的插件(插件置于文末,需要请自取)。

Unity播放视频的两种方式

(1)使用RawImage播放视频
首先创建一个RawImage,调整为视频分辨率大小(本次案例使用1920*1080),并在RawImage上挂载VideoPlayer组件(这一步也可使用代码自动挂载,可自行选择),如下图所示:

为满足实际项目需求,将视频进行外部文件读取操作,使更换视频的操作更加顺畅,将VideoPlayer的视频资源路径选项更改为URL进行视频文件的抓取

接下来使用脚本对进行操作,即可实现外部文件夹读取视频进行视频的播放,脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
using System.IO;

public class VideoPlayerController : MonoBehaviour

    RawImage videopanel;
    VideoPlayer player;
    public string videoname;//自行在外部填写

    bool isplay;

    // Start is called before the first frame update
    void Start()
    
        videopanel = transform.GetComponent<RawImage>();
        player = transform.GetComponent<VideoPlayer>();
        isplay = false;
    

    KeyCode code;

    // Update is called once per frame
    void Update()
    
        VideoPlayStatus();
        if (isplay)
        
            videopanel.texture = player.texture;
        
    

    /// <summary>
    /// 控制视频的播放状态
    /// </summary>
    void VideoPlayStatus()
    
        if (Input.GetKeyDown(KeyCode.Return))
        
            GetVideoUrl(videoname);
            isplay = true;
            Debug.Log("获取视频并播放");
        
        if (!isplay)
        
            if (Input.GetKeyDown(KeyCode.Space))
            
                isplay = true;
                player.Play();
                Debug.Log("继续播放视频");
            
        
        else
        
            if (Input.GetKeyDown(KeyCode.Space))
            
                isplay = false;
                player.Pause();
                Debug.Log("暂停");
            
        
        if (Input.GetKeyDown(KeyCode.Escape))
        
            player.Stop();
            Debug.Log("停止");
        
    

    /// <summary>
    /// 获取视频资源(可更改参数进行切换视频操作)
    /// </summary>
    void GetVideoUrl(string name)
    
        name = videoname;
        string path = Application.streamingAssetsPath + "/" + name;
        GetVideoPlayCommponent();
        if (File.Exists(path))
        
            player.url = path;
        
        else
        
            Debug.LogError("视频不存在");
        
    

    /// <summary>
    /// 选择是否手动挂载VideoPlayer组件
    /// </summary>
    void GetVideoPlayCommponent()
    
        if (!transform.GetComponent<VideoPlayer>())
        
            player=transform.gameObject.AddComponent<VideoPlayer>();
        
        else
        
            return;
        
    

演示效果如下:

(2)使用插件Av Pro播放视频
首先导入插件,创建AVpro Video uGUI,如下图:

将AVpro Video uGUI调整为所需视频分辨率大小,并且按照需求可将视频默认底图取消勾选,将Scale Mode的模式更改为全屏(做视频切换的时候尤为重要)

创建MediaPlayer,如下图:

将MediaPlayer赋值给AVpro Video uGUI,可直接点击MediaPlayer的Browse选择视频,为了方便实际项目需求,将视频使用参数读取,如下图所示:

使用脚本进行对视频的各种控制,完成比较齐全的控制视频的播放(包括无暇切换视频),对于播放、暂停、停止方法都写好了直接调用就好了,使用如下脚本:

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

public class VideoController : MonoBehaviour

    public Slider slider;
    MediaPlayer media;
    //视频播放时间
    public Text play_time;
    int play_m;
    int play_s;
    int m;
    int s;

    bool isplay = true;
    bool _wasPlayingOnScrub;
    float _setVideoSeekSliderValue;

    public MediaPlayer.FileLocation _location = MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder;
    DisplayUGUI uGUI;
    string videoname0;
    string videoname1;
    public Texture[] tex; //切换视频时需要先切换视频的首帧图片 不然会泛白

    private void Start()
    
        slider.value = 0;
        media = GameObject.Find("MediaPlayer").GetComponent<MediaPlayer>();
        uGUI = transform.GetComponent<DisplayUGUI>();
        videoname0 = "SampleCube.mp4";
        videoname1 = "SampleSphere.mp4";
    
    public void OnVideoSliderDown()
    
        if (media)
        
            _wasPlayingOnScrub = media.Control.IsPlaying();
            if (_wasPlayingOnScrub)
            
                media.Control.Pause();
            
            OnVideoSeekSlider();
        
    
    public void OnVideoSliderUp()
    
        if (media && _wasPlayingOnScrub)
        
            media.Control.Play();
            _wasPlayingOnScrub = false;
        
    


    void Update()
    
        VideoPlay_time();
        VideoTimeSlider();
        Controller();
    


    void Controller()
    
        if (Input.GetKeyDown(KeyCode.Alpha1))
        
            uGUI._defaultTexture = tex[0];
            OnOpenVideoFile(videoname0);
        
        if (Input.GetKeyDown(KeyCode.Alpha2))
        
            uGUI._defaultTexture = tex[1];
            OnOpenVideoFile(videoname1);
        
    

    /// <summary>
    /// 视频进度条更新
    /// </summary>
    void VideoTimeSlider()
    
        if (media && media.Info != null && media.Info.GetDurationMs() > 0f)
        
            float time = media.Control.GetCurrentTimeMs();
            float duration = media.Info.GetDurationMs();
            float d = Mathf.Clamp(time / duration, 0.0f, 1.0f);
            _setVideoSeekSliderValue = d;
            slider.value = d;
            if (media.Control.IsBuffering())
            
                float t1 = 0f;
                float t2 = media.Control.GetBufferingProgress();
                if (t2 <= 0f)
                
                    if (media.Control.GetBufferedTimeRangeCount() > 0)
                    
                        media.Control.GetBufferedTimeRange(0, ref t1, ref t2);
                        t1 /= media.Info.GetDurationMs();
                        t2 /= media.Info.GetDurationMs();
                    
                
            
        
    

    /// <summary>
    /// 视频播放
    /// </summary>
    public void OnPlayButton()
    
        if (media)
        
            media.Control.Play();
        
    

    /// <summary>
    /// 视频暂停
    /// </summary>
    public void OnPauseButton()
    
        if (media)
        
            media.Control.Pause();
        
    

    /// <summary>
    /// 更改视频进度
    /// </summary>
    public void OnVideoSeekSlider()
    
        if (media && slider && slider.value != _setVideoSeekSliderValue)
        
            media.Control.Seek(slider.value * media.Info.GetDurationMs());
        
    

    /// <summary>
    /// 显示视频的时长进度
    /// </summary>
    void VideoPlay_time()
    
        play_m = (int)(media.Control.GetCurrentTimeMs() * 0.001f / 60);
        play_s = (int)(media.Control.GetCurrentTimeMs() * 0.001f % 60);
        m = (int)(media.Info.GetDurationMs() * 0.001f / 60);
        s = ((int)((media.Info.GetDurationMs() * 0.001f) - m * 60));
        if (play_s < 10)
        
            play_time.text = play_m + ":" + "0" + play_s + " / " + m + ":" + s;
        
        else
        
            play_time.text = play_m + ":" + play_s + " / " + m + ":" + s;
        
    


    public void OnOpenVideoFile(string name)
    
        uGUI.gameObject.SetActive(true);
        media.m_VideoPath = System.IO.Path.Combine(name);
        if (string.IsNullOrEmpty(media.m_VideoPath))
        
            media.CloseVideo();
        
        else
        
            media.OpenVideoFromFile(_location, media.m_VideoPath);
        
    
    private void OnDisable()
    
        isplay = true;
    


给Slider物体添加方法如下图:

演示效果如下:

链接:https://pan.baidu.com/s/1DVCRfWYVRR15MTdy-xtJDQ
提取码:avpr

以上是关于视频播放插件AVPro1-插件介绍的主要内容,如果未能解决你的问题,请参考以下文章

ckplayer插件播放视频

AVProVideo☀️一一款U3D视频播放插件介绍

ckplayer.js视频播放插件

Unity 视频播放

青书学堂刷视频自动刷课软件刷课插件分享

Videojs视频插件在React中的应用