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

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

UI效果:

Unity AVPro Video 加载视频第一秒图片与例子
点击图片进行播放,在点击一下关闭播放
Unity AVPro Video 加载视频第一秒图片与例子

部分代码:

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

Unity AVPro Video 加载视频第一秒图片与例子
2.创建Scroll View
Unity AVPro Video 加载视频第一秒图片与例子
3.给Scroll View 的Content添加Grid Layout Group 和 Content Size Fitter组件,按需调整里面参数
Unity AVPro Video 加载视频第一秒图片与例子

4创建MediaPlayer和displayUGUI组件

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

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

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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球