Unity AVPro Video 加载视频第一秒图片与例子

这篇具有很好参考价值的文章主要介绍了Unity AVPro Video 加载视频第一秒图片与例子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用AVPro Video 加载视频第一秒的图片
原理:使用AVPro Video插件的MediaPlayer
mediaPlayer.OpenMedia(new MediaPath(url链接, MediaPathType.AbsolutePathOrURL), false);
然后等待一定时间
使用ExtractFrame截取视频
Texture2D texture2D = mediaPlayer.ExtractFrame(null, 1);

UI效果:
mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎
点击图片进行播放,在点击一下关闭播放
mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎

部分代码:

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

    [SerializeField] private MediaPlayer mediaPlayer;
    [SerializeField] private DisplayUGUI displayUGUI;           //显示视频
    //预制体 => 一个Image
    [SerializeField] private GameObject VideoPlayerPre;         //视频
    
    [SerializeField] private bool LoadFinish;                   //所有链接都加载完成的标记
    
    // Start is called before the first frame update
    void Start()
    {
        Init();
    }
    
	private void Init()
    {
        if (mediaPlayer == null)
        {
            mediaPlayer = transform.Find("MediaPlayer").GetComponent<MediaPlayer>();
        }
        //mediaPlayer.Events.AddListener(OnMediaPlayerEvent); //事件监听

        if (displayUGUI == null)
        {
            displayUGUI = transform.Find("VideoDisplay").GetComponent<DisplayUGUI>();
            if (displayUGUI.CurrentMediaPlayer == null)
            {
                displayUGUI.CurrentMediaPlayer = mediaPlayer;
            }
        }
        //按需添加, 我的需求是设备是摄像机(播放视频流)时,displayUGUI没有点击事件,设备告警(会有mp4视频链接), displayUGUI有点击事件(可以关闭,打开另一个视频)
        //EventTriggerListener.Get(displayUGUI.gameObject).OnClick = (go) => CloseVideo();
    }
    
    /// <summary>
    /// 加载视频第一秒图片
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    private IEnumerator LoadVideo(List<string> urls)
    {
        yield return null;  //下一帧开始处理

        Debug.Log("开始执行...");

        if (urls.Count == 0) yield break;

        for (int i = 0; i < urls.Count; i++)
        {
            mediaPlayer.OpenMedia(new MediaPath(urls[i], MediaPathType.AbsolutePathOrURL), false);
            //等待0.3秒,按需调整等待时间
            Debug.Log("开始等待0.3秒, i = " + i);
            yield return new WaitForSeconds(0.5f);
            Debug.Log("结束等待0.3秒, i = " + i);
            //取第一秒的图
            Texture2D texture2D = mediaPlayer.ExtractFrame(null, 1);
            if (texture2D == null)
            {
                Debug.LogWarning($"需要调整等待时间 i = {i} url = {urls[i]}");   //加载失败
                continue;
            }
            //将视频第一秒加载到图片上
            GameObject video = Instantiate<GameObject>(VideoPlayerPre);
            video.SetActive(true);
            video.transform.SetParent(scrollRect.content);
            //需要用Image, 我尝试使用RawImage无法显示图像
            video.GetComponent<Image>().sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
            video.GetComponent<VideoUrlInfo>().videoUrl = urls[i];   //将数据保存到VideoUrlInfo组件上
            //给图片添加点击事件,我这里的需求是点击后才播放视频
            EventTriggerListener.Get(video).OnClick = (go) => PlayVideo(go.GetComponent<VideoUrlInfo>().videoUrl);
            yield return null;
        }

        LoadFinish = true;
    }

所有代码:

/* ======================================================================================
*      作 者:
*      主 题:
*      主要功能:

*      详细描述:

*      创建时间:2022-11-11 19:52:34
*      修改记录:
*      版 本:1.0
  =======================================================================================*/
using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using UnityEngine;
using UnityEngine.UI;

public class TestAVPro : MonoBehaviour
{
    [SerializeField] private MediaPlayer mediaPlayer;
    [SerializeField] private DisplayUGUI displayUGUI;           //显示视频

    [SerializeField] private ScrollRect scrollRect;             //滚动视图

    //预制体
    [SerializeField] private GameObject VideoPlayerPre;         //视频

    [SerializeField] private bool LoadFinish;                   //所有链接都加载完成的标记

    // Start is called before the first frame update
    void Start()
    {
        Init();
        //测试
        Test();
    }

    /// <summary>
    /// 加载视频
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    private IEnumerator LoadVideo(List<string> urls)
    {
        yield return null;  //下一帧开始处理

        Debug.Log("开始执行...");

        if (urls.Count == 0) yield break;

        for (int i = 0; i < urls.Count; i++)
        {
            mediaPlayer.OpenMedia(new MediaPath(urls[i], MediaPathType.AbsolutePathOrURL), false);
            //等待0.3秒,按需调整等待时间
            Debug.Log("开始等待0.3秒, i = " + i);
            yield return new WaitForSeconds(0.5f);
            Debug.Log("结束等待0.3秒, i = " + i);
            //取第一秒的图
            Texture2D texture2D = mediaPlayer.ExtractFrame(null, 1);
            if (texture2D == null)
            {
                Debug.LogWarning($"需要调整等待时间 i = {i} url = {urls[i]}");   //加载失败
                continue;
            }
            //将视频第一秒加载到图片上
            GameObject video = Instantiate<GameObject>(VideoPlayerPre);
            video.SetActive(true);
            video.transform.SetParent(scrollRect.content);
            //需要用Image, 我尝试使用RawImage无法显示图像
            video.GetComponent<Image>().sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));
            video.GetComponent<VideoUrlInfo>().videoUrl = urls[i];   //将数据保存到VideoUrlInfo组件上
            //给图片添加点击事件,我这里的需求是点击后才播放视频
            EventTriggerListener.Get(video).OnClick = (go) => PlayVideo(go.GetComponent<VideoUrlInfo>().videoUrl);
            yield return null;
        }

        LoadFinish = true;
    }

    /// <summary>
    /// 图片被点击播放视频(图片是第一秒的视频)
    /// </summary>
    /// <param name="url"></param>
    private void PlayVideo(string url)
    {
        if (!LoadFinish) return;
        if (url.IsNullOrEmpty()) return;

        displayUGUI.gameObject.SetActive(true);
        mediaPlayer.OpenMedia(new MediaPath(url, MediaPathType.AbsolutePathOrURL));
    }

    private void Init()
    {
        if (mediaPlayer == null)
        {
            mediaPlayer = transform.Find("MediaPlayer").GetComponent<MediaPlayer>();
        }
        mediaPlayer.Events.AddListener(OnMediaPlayerEvent); //事件监听

        if (displayUGUI == null)
        {
            displayUGUI = transform.Find("VideoDisplay").GetComponent<DisplayUGUI>();
            if (displayUGUI.CurrentMediaPlayer == null)
            {
                displayUGUI.CurrentMediaPlayer = mediaPlayer;
            }
        }
        //按需添加, 我的需求是设备是摄像机(播放视频流)时,displayUGUI没有点击事件,设备告警(会有mp4视频链接), displayUGUI有点击事件(可以关闭,打开另一个视频)
        EventTriggerListener.Get(displayUGUI.gameObject).OnClick = (go) => CloseVideo();

        if (scrollRect == null)
        {
            scrollRect = transform.Find("ScrollView").GetComponent<ScrollRect>();
        }

        if (VideoPlayerPre == null)
            this.VideoPlayerPre = transform.Find("VideoPlayerPre").gameObject;
        VideoPlayerPre.SetActive(false);    //不需要显示
    }

    private void Test()
    {
        List<string> urls = new List<string>();
        //网上找的测试地址
        urls.Add("http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4");    //驯龙高手
        urls.Add("http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4");    //紧急救援
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4");    //玩具总动员
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4");    //叶问4 先行预告甄子丹过招美
        urls.Add("http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4");    //预告刘德华对决古天
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710122716702150.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710095541348171.mp4");

        //压测一下
        urls.Add("http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4");    //驯龙高手
        urls.Add("http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4");    //紧急救援
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4");    //玩具总动员
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4");    //叶问4 先行预告甄子丹过招美
        urls.Add("http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4");    //预告刘德华对决古天
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710122716702150.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710095541348171.mp4");

        urls.Add("http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4");    //驯龙高手
        urls.Add("http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4");    //紧急救援
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4");    //玩具总动员
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4");    //叶问4 先行预告甄子丹过招美
        urls.Add("http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4");    //预告刘德华对决古天
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710122716702150.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710095541348171.mp4");

        urls.Add("http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4");    //驯龙高手
        urls.Add("http://vfx.mtime.cn/Video/2019/03/21/mp4/190321153853126488.mp4");    //紧急救援
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319222227698228.mp4");    //玩具总动员
        urls.Add("http://vfx.mtime.cn/Video/2019/03/19/mp4/190319212559089721.mp4");    //叶问4 先行预告甄子丹过招美
        urls.Add("http://vfx.mtime.cn/Video/2019/03/18/mp4/190318231014076505.mp4");    //预告刘德华对决古天
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710171112971120.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710122716702150.mp4");
        urls.Add("http://vfx.mtime.cn/Video/2021/07/10/mp4/210710095541348171.mp4");

        StartCoroutine(LoadVideo(urls));
    }

    private void OnMediaPlayerEvent(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
    {
        switch (arg1)
        {
            case MediaPlayerEvent.EventType.Started:    //开始播放的事件
                //videoLoad = true;       //已经加载完成
                //quanImage.Deactivate(); //隐藏
                break;
        }

        switch (arg2)
        {
            case ErrorCode.LoadFailed:
                //videoTip.text = "加载出错,网络连接不稳定, 请稍后重试!!!";
                //videoTip.Activate();     //显示
                //videoLoad = true;       //加载出错
                //quanImage.Deactivate();  //隐藏
                break;
            case ErrorCode.DecodeFailed:
                break;
        }
    }

    /// <summary>
    /// 关闭视频 displayUGUI的点击事件
    /// </summary>
    private void CloseVideo()
    {
        displayUGUI.gameObject.SetActive(false);
        mediaPlayer.Stop();
    }
}

UI
1.创建一个空对象并添加TestAVPro(自己写的脚本)
mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎
2.创建Scroll View
mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎
3.给Scroll View 的Content添加Grid Layout Group 和 Content Size Fitter组件,按需调整里面参数
mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎

4创建MediaPlayer和displayUGUI组件
mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎
mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎

5.关闭自动播放和自动打开mediaplayer.openmedia,工作记录,unity,音视频,游戏引擎6.需要改名称和脚本中对应(按照自己的来改)

7.一个工具类型,给UI添加点击事件

using UnityEngine;
using UnityEngine.EventSystems;

/// <summary>
/// UI添加点击事件
/// </summary>
public class EventTriggerListener : EventTrigger
{
    public delegate void voidDelegate(GameObject obj);
    public voidDelegate OnBtnDown;
    public voidDelegate OnBtnUp;
    public voidDelegate OnEnter;
    public voidDelegate OnExit;
    public voidDelegate OnStay;
    public voidDelegate OnClick;
    public voidDelegate OnDoubleClick;
    private bool isEnter = false;
    public void Update()
    {
        if (isEnter)
        {
            if (OnStay != null)
            {
                OnStay(gameObject);
            }
        }
    }
    public static EventTriggerListener Get(GameObject obj)
    {
        EventTriggerListener eventTriggerListener = obj.GetComponent<EventTriggerListener>();
        if (eventTriggerListener == null)
        {
            eventTriggerListener = obj.AddComponent<EventTriggerListener>();
        }
        return eventTriggerListener;
    }
    /// <summary>
    /// 判断是否是第二次点击
    /// </summary>
    private bool isTwo = true;
    private bool isOver = true;
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (OnBtnDown != null)
        {
            OnBtnDown(gameObject);
        }
        isTwo = !isTwo;
        if (!isOver)
        {
            return;
        }
        isOver = false;
        Invoke("SelectClick", 0.3f);
    }

    public void SelectClick()
    {
        if (isTwo)
        {
            if (OnDoubleClick != null)
            {
                OnDoubleClick(gameObject);
            }
        }
        else
        {
            if (OnClick != null)
            {
                OnClick(gameObject);
            }
        }
        isTwo = true;
        isOver = true;
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (OnBtnUp != null)
        {
            OnBtnUp(gameObject);
        }
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (OnEnter != null)
        {
            OnEnter(gameObject);
        }
        isEnter = true;
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        if (OnExit != null)
        {
            OnExit(gameObject);
        }
        isEnter = false;
    }
}

工程地址
提取码:o93j

插件仅供学习交流,请勿用于商业用途文章来源地址https://www.toymoban.com/news/detail-550305.html

到了这里,关于Unity AVPro Video 加载视频第一秒图片与例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】AVPro使用踩坑,编辑器模式使用视频播放正常,打包后视频无法播放的问题

    这个主要是AVPro的坑 一般使用会直接Browse给取文件路径,然后面板上面就能看到视频文件的名字,这个方法在编辑器模式下播放是可以获取到文件的,所以没问题。 但是打包后路径变化,拉取到的地址就不对了。 首先把视频资源改存到StreamingAssets文件夹路径下,然后路径获

    2024年02月16日
    浏览(53)
  • vue 使用vue-video-player加载视频(铺满容器)

    安装 main.js 引入 使用 使视频铺满容器

    2024年02月13日
    浏览(40)
  • uniapp video(倍速功能、层级过高、视频第一帧做封面 等问题)

             由于上次写video组件的问题,过于划水,没讲清楚,导致自己花费了很多时间,重新踩坑,对自己很抱歉。 效果图如下:倍速的显示和隐藏,需在全屏的时候 和 显示控制组件时 代码逻辑 1. 实现倍速的核心是创建视频组件控制器,调用它的倍速方法 =》官方文档

    2024年02月08日
    浏览(41)
  • 图片生成视频来了:Stable Video Diffusion使用教程

    11月22日 Stability AI 发布了一个AI视频的开源项目:Stable Video Diffusion,它可以基于一张图片生成数秒钟的视频,效果比较惊艳,本文就给大家分享下如何安装和使用。 视频不方便分享,我这里做成了gif动图,可以看到画面很稳定,基本上是没有闪烁的。 这个程序对显卡的要求

    2024年04月14日
    浏览(435)
  • 使用【Blob、Base64】两种方式显示【文本、图片、视频】 & 使用 video 组件播放视频

    Blob 对象的类型是由 MIME 类型(Multipurpose Internet Mail Extensions)来确定的。MIME 类型是一种标准,用于表示文档、图像、音频、视频等多媒体文件的类型。以下是一些常见的 Blob 对象类型: text/plain :纯文本文件。 text/html :HTML文件。 text/xml :XML文件。 image/png :PNG格式的图像

    2024年02月03日
    浏览(48)
  • 多模态——使用stable-video-diffusion将图片生成视频

    近期,stabilityAI发布了一个新的项目,是将图片作为基础,生成一个相关的小视频,其实也算是其之前研究内容的扩展。早在stable-diffusion的模型开源出来的时候,除了由prompt生成图片之外,也可以生成连续帧的短视频。 本文主要是体验一下stable-video-diffusion的使用,以及对其

    2024年02月05日
    浏览(81)
  • Unity视频播放之Video Player的简单使用

    使用Unity自带的VideoPlayer来播放视频 一、准备视频 Unity3D常用视频格式:.mov、.mpg、.mpeg、.mp4、.avi、.asf 如果都不识别,试试转换成ogv格式。转换完成之后,将视频素材文件拖入Unity Assets 文件夹内。 二、创建UI及添加组件 创建RenderTexture资源,设置分辨率,跟视频分辨率一致

    2024年01月18日
    浏览(86)
  • Unity2020Video player发布后无法播放视频问题

    我也是小白,用Unity过程中也是遇到很多草蛋问题,我在做demo的时候第一次用到Unity的video player,听说ogv格式能直接播放,我就把视频转了ogv格式,然后放到clip里,编辑器里运行完全没问题,发布打包后就播放不了,黑屏都没有,直接视频没了,百度搜的绝对路径说是放到

    2024年02月15日
    浏览(51)
  • 使用vant+video.js实现轮播图图片和视频轮播播放

    先上效果图 1. 安装 2. 在需要用到的页面引入 3. 具体页面使用 假设传给子组件的数组结构 按照步骤来使用,其他地方视频播放情况都还好,至少安卓是好的,只是点击播放和暂停时候,ios需要点击多下才能触发点击事件; 然后以为是video.js插件可能没更新,ios版本迭代超过

    2023年04月08日
    浏览(44)
  • 前端Vue自定义轮播图视频播放组件 仿京东商品详情轮播图视频Video播放效果 可图片预览

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包