Unity AVPro Video 加载视频第一秒图片与例子
使用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 加载视频第一秒图片与例子相关推荐
- vue 使用video加载视频进行展示,视频循环自动播放
vue 使用video加载视频进行展示,视频循环自动播放loop autoplay <span v-else-if="item.prop === 'alarmVedio'"& ...
- 【Qt】使用ffmpeg加载视频第一帧作为图标
环境说明 我这里使用的是Qt5环境,当然你可以使用其他环境,原理应该都差不多的. 导入ffmpeg库 首先在Qt的工程文件,就是.pro格式的那个,打开,然后加入下面代码,我这里对windows和ma ...
- 解决 CHROME FLASH 不能自动播放的问题及加载视频前的“黑色背景”如何改变
chrome中flash不能自动播放,相信很多人都遇到了这个问题,网上检索的话,很多都会提到添加muted,当时尝试了这个方法,根本不起作用.后来慢慢发现一种情况:当单独在根节点中放入video后,可 ...
- [html] 说说video标签中预加载视频用到的属性是什么?
[html] 说说video标签中预加载视频用到的属性是什么? 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题
- OpenCV中使用类VideoCapture加载视频和打开摄像头
先直接上示例代码,然后对代码进行讲解. #!/usr/bin/env python # -*- coding: utf-8 -*- # 图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 248 ...
- Opencv step by step - 加载视频
刚买了本 "学习Opencv" 这本书,慢慢看起来. 一开始就是加载视频了.当然了,首先你要有个视频 从这里下载了一个: tan@ubuntu:~$ wget http://www ...
- ajax视频播放,XMLHttpRequest加载视频并播放
XMLHttpRequest加载视频文件2进制数据流到客户端,并使用video控件播放.结合XMLHttpRequest Level 2特性,可以使用XMLHttpRequest对象接受服务器端返回的 ...
- videojs 动态加载视频
VideoJS dynamic source change via RESTful API 'Undefined' issue with changing RTMP source on compres ...
- 又有坑是吧——MediaPlayer加载视频为什么这么慢
"今天又是充满希望的一天" 背景 最近在做一个视频播放的需求,因为比较简单,只需要实现基本的loading,播放,暂停等功能,所以就用Android系统的播放器MediaPlaye ...
最新文章
- [UML]UML系列——包图Package
- prim算法构建最小生成树
- 链接 动态链接 静态链接
- 如何在ftp服务器下查找文件夹,查找ftp服务器下的文件夹名
- 前端学习(1655):前端系列实战课程之浏览器类型监测
- java对象和json对象之间互相转换
- 如何获取字符的ASCII值
- 思想篇(3)—IT运用模式的轮回
- Java的继承和python的继承_Java ,python面向对象的继承及其区别
- 算法题——投篮比赛获胜概率问题
- 190628每日一句
- vue添加响应response拦截器,响应登陆超时处理
- UG软件_NX1926中文版网盘下载链接+安装教程
- C语言程序设计 课程设计报告
- 微信公众号支付开发流程
- 市场供需简单模型分析
- PHP源码 京东联盟API接口,转链+cha询订单,cha询推广位
- 卡通头像生成器Avataaars generator
- java面试-多线程常见面试题
- 20191123_python朴素贝叶斯算法实现
热门文章
- lr(0)文法的判断与分析 python_怎么判断一个文法是LR(0)
- 查询微信号被谁投诉封方法
- 计算机辅助建筑设计英文全称是,计算机辅助建筑消防安全设计,computer-aided building fire safety design,音标,读音,翻译,英文例句,英语词典...
- 多省面匠相约中国“拉面之乡”同台切磋拉面技艺
- 数据可视化—D3力导向图—如何实现结点与其连线的交互
- 计算机专业大学排名评估,计算机专业全国高校排名top100出炉,根据第四轮学科评估...
- html老师点名软件的代码,随机点名器点击按钮文字随机点名器代码
- 怎么将文字转换成语音?文字转语音怎么做最简单?
- C. Minimum Value Rectangle(基本不等式等式成立的条件)
- [算法]二维数组前缀和