Reproducción de video de la unidad

Reproducción de video de la unidad

prefacio

Hay muchas formas de reproducir video en el motor de Unity, aquí hay dos. Una es usar la textura del componente RawImage para reproducir el video y copiar la imagen de cada fotograma del video en el mapa de textura de RawImage para realizar la reproducción y visualización del video; la otra es usar el complemento Av Pro para reproducir el video En este caso, utilicé la versión AVProVideo1.9.6 del complemento (el complemento se encuentra al final del artículo, recójalo si lo necesita).

Dos formas de reproducir video en Unity

(1) Use RawImage para reproducir video
Primero cree un RawImage, ajústelo a la resolución de video (1920 * 1080 en este caso) y monte el componente VideoPlayer en RawImage (este paso también se puede montar automáticamente por código, puede elegir usted mismo), como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
Para satisfacer las necesidades reales del proyecto, el video se lee desde un archivo externo para que la operación de reemplazar el video sea más fluida, y la opción de ruta de recursos de video de VideoPlayer se cambia a URL para capturar el archivo de video. Luego, use el
inserte la descripción de la imagen aquí
script Para operar, puede leer el video desde la carpeta externa y reproducir el video. El script es el siguiente:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
using System.IO;

public class VideoPlayerController : MonoBehaviour
{
    
    
    RawImage videopanel;
    VideoPlayer player;
    public string videoname;//自行在外部填写

    bool isplay;

    // Start is called before the first frame update
    void Start()
    {
    
    
        videopanel = transform.GetComponent<RawImage>();
        player = transform.GetComponent<VideoPlayer>();
        isplay = false;
    }

    KeyCode code;

    // Update is called once per frame
    void Update()
    {
    
    
        VideoPlayStatus();
        if (isplay)
        {
    
    
            videopanel.texture = player.texture;
        }
    }

    /// <summary>
    /// 控制视频的播放状态
    /// </summary>
    void VideoPlayStatus()
    {
    
    
        if (Input.GetKeyDown(KeyCode.Return))
        {
    
    
            GetVideoUrl(videoname);
            isplay = true;
            Debug.Log("获取视频并播放");
        }
        if (!isplay)
        {
    
    
            if (Input.GetKeyDown(KeyCode.Space))
            {
    
    
                isplay = true;
                player.Play();
                Debug.Log("继续播放视频");
            }
        }
        else
        {
    
    
            if (Input.GetKeyDown(KeyCode.Space))
            {
    
    
                isplay = false;
                player.Pause();
                Debug.Log("暂停");
            }
        }
        if (Input.GetKeyDown(KeyCode.Escape))
        {
    
    
            player.Stop();
            Debug.Log("停止");
        }
    }

    /// <summary>
    /// 获取视频资源(可更改参数进行切换视频操作)
    /// </summary>
    void GetVideoUrl(string name)
    {
    
    
        name = videoname;
        string path = Application.streamingAssetsPath + "/" + name;
        GetVideoPlayCommponent();
        if (File.Exists(path))
        {
    
    
            player.url = path;
        }
        else
        {
    
    
            Debug.LogError("视频不存在");
        }
    }

    /// <summary>
    /// 选择是否手动挂载VideoPlayer组件
    /// </summary>
    void GetVideoPlayCommponent()
    {
    
    
        if (!transform.GetComponent<VideoPlayer>())
        {
    
    
            player=transform.gameObject.AddComponent<VideoPlayer>();
        }
        else
        {
    
    
            return;
        }
    }
}

El efecto de demostración es el siguiente:
inserte la descripción de la imagen aquí

(2) Use el complemento Av Pro para reproducir video
Primero importe el complemento y cree AVpro Video uGUI, como se muestra en la figura a continuación:
inserte la descripción de la imagen aquí
Ajuste AVpro Video uGUI al tamaño de resolución de video requerido y desmarque el mapa base predeterminado de video según sea necesario, y configure el modo de escala. Cambie el modo a pantalla completa (especialmente importante al cambiar de video)
inserte la descripción de la imagen aquí

Cree un MediaPlayer, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
Asigne MediaPlayer a AVpro Video uGUI, y haga clic directamente en el botón Examinar de MediaPlayer para seleccionar un video. Para facilitar las necesidades reales del proyecto, lea los parámetros de uso del video, como se muestra en la figura abajo:
inserte la descripción de la imagen aquí

Use secuencias de comandos para realizar varios controles en el video, complete un control relativamente completo de la reproducción de video (sin tiempo para cambiar de video), escriba los métodos de reproducción, pausa y detención y llámelos directamente, use la siguiente secuencia de comandos:

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

public class VideoController : MonoBehaviour
{
    
    
    public Slider slider;
    MediaPlayer media;
    //视频播放时间
    public Text play_time;
    int play_m;
    int play_s;
    int m;
    int s;

    bool isplay = true;
    bool _wasPlayingOnScrub;
    float _setVideoSeekSliderValue;

    public MediaPlayer.FileLocation _location = MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder;
    DisplayUGUI uGUI;
    string videoname0;
    string videoname1;
    public Texture[] tex; //切换视频时需要先切换视频的首帧图片 不然会泛白

    private void Start()
    {
    
    
        slider.value = 0;
        media = GameObject.Find("MediaPlayer").GetComponent<MediaPlayer>();
        uGUI = transform.GetComponent<DisplayUGUI>();
        videoname0 = "SampleCube.mp4";
        videoname1 = "SampleSphere.mp4";
    }
    public void OnVideoSliderDown()
    {
    
    
        if (media)
        {
    
    
            _wasPlayingOnScrub = media.Control.IsPlaying();
            if (_wasPlayingOnScrub)
            {
    
    
                media.Control.Pause();
            }
            OnVideoSeekSlider();
        }
    }
    public void OnVideoSliderUp()
    {
    
    
        if (media && _wasPlayingOnScrub)
        {
    
    
            media.Control.Play();
            _wasPlayingOnScrub = false;
        }
    }


    void Update()
    {
    
    
        VideoPlay_time();
        VideoTimeSlider();
        Controller();
    }


    void Controller()
    {
    
    
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
    
    
            uGUI._defaultTexture = tex[0];
            OnOpenVideoFile(videoname0);
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
    
    
            uGUI._defaultTexture = tex[1];
            OnOpenVideoFile(videoname1);
        }
    }

    /// <summary>
    /// 视频进度条更新
    /// </summary>
    void VideoTimeSlider()
    {
    
    
        if (media && media.Info != null && media.Info.GetDurationMs() > 0f)
        {
    
    
            float time = media.Control.GetCurrentTimeMs();
            float duration = media.Info.GetDurationMs();
            float d = Mathf.Clamp(time / duration, 0.0f, 1.0f);
            _setVideoSeekSliderValue = d;
            slider.value = d;
            if (media.Control.IsBuffering())
            {
    
    
                float t1 = 0f;
                float t2 = media.Control.GetBufferingProgress();
                if (t2 <= 0f)
                {
    
    
                    if (media.Control.GetBufferedTimeRangeCount() > 0)
                    {
    
    
                        media.Control.GetBufferedTimeRange(0, ref t1, ref t2);
                        t1 /= media.Info.GetDurationMs();
                        t2 /= media.Info.GetDurationMs();
                    }
                }
            }
        }
    }

    /// <summary>
    /// 视频播放
    /// </summary>
    public void OnPlayButton()
    {
    
    
        if (media)
        {
    
    
            media.Control.Play();
        }
    }

    /// <summary>
    /// 视频暂停
    /// </summary>
    public void OnPauseButton()
    {
    
    
        if (media)
        {
    
    
            media.Control.Pause();
        }
    }

    /// <summary>
    /// 更改视频进度
    /// </summary>
    public void OnVideoSeekSlider()
    {
    
    
        if (media && slider && slider.value != _setVideoSeekSliderValue)
        {
    
    
            media.Control.Seek(slider.value * media.Info.GetDurationMs());
        }
    }

    /// <summary>
    /// 显示视频的时长进度
    /// </summary>
    void VideoPlay_time()
    {
    
    
        play_m = (int)(media.Control.GetCurrentTimeMs() * 0.001f / 60);
        play_s = (int)(media.Control.GetCurrentTimeMs() * 0.001f % 60);
        m = (int)(media.Info.GetDurationMs() * 0.001f / 60);
        s = ((int)((media.Info.GetDurationMs() * 0.001f) - m * 60));
        if (play_s < 10)
        {
    
    
            play_time.text = play_m + ":" + "0" + play_s + " / " + m + ":" + s;
        }
        else
        {
    
    
            play_time.text = play_m + ":" + play_s + " / " + m + ":" + s;
        }
    }


    public void OnOpenVideoFile(string name)
    {
    
    
        uGUI.gameObject.SetActive(true);
        media.m_VideoPath = System.IO.Path.Combine(name);
        if (string.IsNullOrEmpty(media.m_VideoPath))
        {
    
    
            media.CloseVideo();
        }
        else
        {
    
    
            media.OpenVideoFromFile(_location, media.m_VideoPath);
        }
    }
    private void OnDisable()
    {
    
    
        isplay = true;
    }
}

El método para agregar al objeto Slider es como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
El efecto de demostración es el siguiente:
inserte la descripción de la imagen aquí
Enlace: https://pan.baidu.com/s/1DVCRfWYVRR15MTdy-xtJDQ
Código de extracción: avpr

Supongo que te gusta

Origin blog.csdn.net/weixin_43541308/article/details/121034026
Recomendado
Clasificación