使用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;
[SerializeField] private GameObject VideoPlayerPre;
[SerializeField] private bool LoadFinish;
void Start()
{
Init();
}
private void Init()
{
if (mediaPlayer == null)
{
mediaPlayer = transform.Find("MediaPlayer").GetComponent<MediaPlayer>();
}
if (displayUGUI == null)
{
displayUGUI = transform.Find("VideoDisplay").GetComponent<DisplayUGUI>();
if (displayUGUI.CurrentMediaPlayer == null)
{
displayUGUI.CurrentMediaPlayer = mediaPlayer;
}
}
}
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);
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);
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];
EventTriggerListener.Get(video).OnClick = (go) => PlayVideo(go.GetComponent<VideoUrlInfo>().videoUrl);
yield return null;
}
LoadFinish = true;
}
所有代码:
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;
void Start()
{
Init();
Test();
}
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);
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);
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];
EventTriggerListener.Get(video).OnClick = (go) => PlayVideo(go.GetComponent<VideoUrlInfo>().videoUrl);
yield return null;
}
LoadFinish = true;
}
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;
}
}
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");
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");
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");
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");
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:
break;
}
switch (arg2)
{
case ErrorCode.LoadFailed:
break;
case ErrorCode.DecodeFailed:
break;
}
}
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组件
7.一个工具类型,给UI添加点击事件
using UnityEngine;
using UnityEngine.EventSystems;
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;
}
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
插件仅供学习交流,请勿用于商业用途
Original: https://blog.csdn.net/weixin_44238530/article/details/127813173
Author: 人生不过一瞬间
Title: Unity AVPro Video 加载视频第一秒图片与例子
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/653073/
转载文章受原作者版权保护。转载请注明原作者出处!