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

UI效果:

点击图片进行播放,在点击一下关闭播放

部分代码:

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 updatevoid 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 updatevoid 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(自己写的脚本)

2.创建Scroll View

3.给Scroll View 的Content添加Grid Layout Group 和 Content Size Fitter组件,按需调整里面参数

4创建MediaPlayer和displayUGUI组件

5.关闭自动播放和自动打开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

插件仅供学习交流,请勿用于商业用途

Unity AVPro Video 加载视频第一秒图片与例子相关推荐

  1. vue 使用video加载视频进行展示,视频循环自动播放

    vue 使用video加载视频进行展示,视频循环自动播放loop autoplay <span v-else-if="item.prop === 'alarmVedio'"& ...

  2. 【Qt】使用ffmpeg加载视频第一帧作为图标

    环境说明 我这里使用的是Qt5环境,当然你可以使用其他环境,原理应该都差不多的. 导入ffmpeg库 首先在Qt的工程文件,就是.pro格式的那个,打开,然后加入下面代码,我这里对windows和ma ...

  3. 解决 CHROME FLASH 不能自动播放的问题及加载视频前的“黑色背景”如何改变

    chrome中flash不能自动播放,相信很多人都遇到了这个问题,网上检索的话,很多都会提到添加muted,当时尝试了这个方法,根本不起作用.后来慢慢发现一种情况:当单独在根节点中放入video后,可 ...

  4. [html] 说说video标签中预加载视频用到的属性是什么?

    [html] 说说video标签中预加载视频用到的属性是什么? 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

  5. OpenCV中使用类VideoCapture加载视频和打开摄像头

    先直接上示例代码,然后对代码进行讲解. #!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 248 ...

  6. Opencv step by step - 加载视频

    刚买了本 "学习Opencv" 这本书,慢慢看起来. 一开始就是加载视频了.当然了,首先你要有个视频 从这里下载了一个: tan@ubuntu:~$ wget http://www ...

  7. ajax视频播放,XMLHttpRequest加载视频并播放

    XMLHttpRequest加载视频文件2进制数据流到客户端,并使用video控件播放.结合XMLHttpRequest Level 2特性,可以使用XMLHttpRequest对象接受服务器端返回的 ...

  8. videojs 动态加载视频

    VideoJS dynamic source change via RESTful API 'Undefined' issue with changing RTMP source on compres ...

  9. 又有坑是吧——MediaPlayer加载视频为什么这么慢

    "今天又是充满希望的一天" 背景 最近在做一个视频播放的需求,因为比较简单,只需要实现基本的loading,播放,暂停等功能,所以就用Android系统的播放器MediaPlaye ...

最新文章

  1. [UML]UML系列——包图Package
  2. prim算法构建最小生成树
  3. 链接 动态链接 静态链接
  4. 如何在ftp服务器下查找文件夹,查找ftp服务器下的文件夹名
  5. 前端学习(1655):前端系列实战课程之浏览器类型监测
  6. java对象和json对象之间互相转换
  7. 如何获取字符的ASCII值
  8. 思想篇(3)—IT运用模式的轮回
  9. Java的继承和python的继承_Java ,python面向对象的继承及其区别
  10. 算法题——投篮比赛获胜概率问题
  11. 190628每日一句
  12. vue添加响应response拦截器,响应登陆超时处理
  13. UG软件_NX1926中文版网盘下载链接+安装教程
  14. C语言程序设计 课程设计报告
  15. 微信公众号支付开发流程
  16. 市场供需简单模型分析
  17. PHP源码 京东联盟API接口,转链+cha询订单,cha询推广位
  18. 卡通头像生成器Avataaars generator
  19. java面试-多线程常见面试题
  20. 20191123_python朴素贝叶斯算法实现

热门文章

  1. lr(0)文法的判断与分析 python_怎么判断一个文法是LR(0)
  2. 查询微信号被谁投诉封方法
  3. 计算机辅助建筑设计英文全称是,计算机辅助建筑消防安全设计,computer-aided building fire safety design,音标,读音,翻译,英文例句,英语词典...
  4. 多省面匠相约中国“拉面之乡”同台切磋拉面技艺
  5. 数据可视化—D3力导向图—如何实现结点与其连线的交互
  6. 计算机专业大学排名评估,计算机专业全国高校排名top100出炉,根据第四轮学科评估...
  7. html老师点名软件的代码,随机点名器点击按钮文字随机点名器代码
  8. 怎么将文字转换成语音?文字转语音怎么做最简单?
  9. C. Minimum Value Rectangle(基本不等式等式成立的条件)
  10. [算法]二维数组前缀和