Unity中使用AVPRO播放视频

一般来说有两种方式。

1.直接播放:

1.1添加组件

1.2设置参数:

注意Auto Open是开始就就打开准备视频,但不播放。

下方红色矩形框住的区域要勾选,出声音外。

2.代码控制:

代码可以让视频播放更灵活,以及很多不同状态的监听

2.1组件与上方一致,参数与上方图片中参数一致。

2.2代码:

cs 复制代码
using UnityEngine;
using RenderHeads.Media.AVProVideo;

public class AVProVideoController : MonoBehaviour
{
    [Header("AVPro组件")]
    [SerializeField] private MediaPlayer mediaPlayer;
    //[SerializeField] private DisplayUGUI displayUGUI;

    [Header("视频设置")]
    [SerializeField] private string videoPath = "Videos/MyVideo.mp4";
    [SerializeField] private bool autoPlay = true;
    [SerializeField] private bool loop = false;

    private void Start()
    {
        if (mediaPlayer == null)
        {
            mediaPlayer = GetComponent<MediaPlayer>();
        }

        if (mediaPlayer != null)
        {
            // 注册所有事件监听
            RegisterEvents();

            // 加载视频
            LoadVideo();
        }
        else
        {
            Debug.LogError("MediaPlayer组件未找到!");
        }
    }

    private void OnDestroy()
    {
        // 注销事件监听
        UnregisterEvents();
    }

    /// <summary>
    /// 注册所有事件监听
    /// </summary>
    private void RegisterEvents()
    {
        mediaPlayer.Events.AddListener(OnMediaPlayerEvent);
    }

    /// <summary>
    /// 注销所有事件监听
    /// </summary>
    private void UnregisterEvents()
    {
        if (mediaPlayer != null)
        {
            mediaPlayer.Events.RemoveListener(OnMediaPlayerEvent);
        }
    }

    /// <summary>
    /// AVPro事件回调
    /// </summary>
    private void OnMediaPlayerEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode errorCode)
    {
        switch (et)
        {
            case MediaPlayerEvent.EventType.ReadyToPlay:
                OnVideoReadyToPlay();//视频准备就绪
                break;

            case MediaPlayerEvent.EventType.Started:
                OnVideoStarted();//视频开始播放
                break;

            case MediaPlayerEvent.EventType.FirstFrameReady:
                OnFirstFrameReady();//视频第一帧已准备就绪
                break;

            case MediaPlayerEvent.EventType.FinishedPlaying:
                OnVideoFinished();//视频播放完成
                break;

            case MediaPlayerEvent.EventType.Closing:
                OnVideoClosing();//视频正在关闭
                break;

            case MediaPlayerEvent.EventType.Error:
                OnVideoError(errorCode);
                break;

            case MediaPlayerEvent.EventType.SubtitleChange:
                OnSubtitleChange();
                break;

            case MediaPlayerEvent.EventType.Stalled:
                OnVideoStalled();
                break;

            case MediaPlayerEvent.EventType.Unstalled:
                OnVideoUnstalled();//视频恢复播放
                break;

            case MediaPlayerEvent.EventType.ResolutionChanged:
                OnResolutionChanged();//分辨率改变
                break;

            case MediaPlayerEvent.EventType.StartedSeeking:
                OnStartedSeeking();//开始跳转播放位置(不只跳转时间,更改倍速和重播也会执行)
                break;

            case MediaPlayerEvent.EventType.FinishedSeeking:
                OnFinishedSeeking();//跳转完成(不只跳转时间,更改倍速和重播也会执行)
                break;

            case MediaPlayerEvent.EventType.StartedBuffering:
                OnStartedBuffering();//视频开始缓冲
                break;

            case MediaPlayerEvent.EventType.FinishedBuffering:
                OnFinishedBuffering();//视频缓冲完成
                break;

            case MediaPlayerEvent.EventType.PropertiesChanged:
                OnPropertiesChanged();
                break;

            case MediaPlayerEvent.EventType.PlaylistItemChanged:
                OnPlaylistItemChanged();
                break;

            case MediaPlayerEvent.EventType.PlaylistFinished:
                OnPlaylistFinished();
                break;
        }
    }

    #region 事件处理方法

    /// <summary>
    /// 视频准备就绪,可以开始播放
    /// </summary>
    private void OnVideoReadyToPlay()
    {
        Debug.Log("视频准备就绪!");
        Debug.Log($"视频时长: {mediaPlayer.Info.GetDuration()} 秒");
        Debug.Log($"视频分辨率: {mediaPlayer.Info.GetVideoWidth()}x{mediaPlayer.Info.GetVideoHeight()}");

        if (autoPlay)
        {
            mediaPlayer.Play();
        }
    }

    /// <summary>
    /// 视频开始播放
    /// </summary>
    private void OnVideoStarted()
    {
        Debug.Log("视频开始播放");
    }

    /// <summary>
    /// 第一帧准备就绪
    /// </summary>
    private void OnFirstFrameReady()
    {
        Debug.Log("第一帧已准备就绪");
    }

    /// <summary>
    /// 视频播放完成
    /// </summary>
    private void OnVideoFinished()
    {
        Debug.Log("视频播放完成!");

        if (loop)
        {
            mediaPlayer.Rewind(false);
            mediaPlayer.Play();
        }
    }

    /// <summary>
    /// 视频正在关闭
    /// </summary>
    private void OnVideoClosing()
    {
        Debug.Log("视频正在关闭");
    }

    /// <summary>
    /// 视频播放错误
    /// </summary>
    private void OnVideoError(ErrorCode errorCode)
    {
        Debug.LogError($"视频播放错误: {errorCode}");
    }

    /// <summary>
    /// 字幕改变
    /// </summary>
    private void OnSubtitleChange()
    {
        Debug.Log("字幕改变");
    }

    /// <summary>
    /// 视频卡顿
    /// </summary>
    private void OnVideoStalled()
    {
        Debug.LogWarning("视频卡顿");
    }

    /// <summary>
    /// 视频恢复
    /// </summary>
    private void OnVideoUnstalled()
    {
        Debug.Log("视频恢复播放");
    }

    /// <summary>
    /// 分辨率改变
    /// </summary>
    private void OnResolutionChanged()
    {
        Debug.Log($"分辨率改变: {mediaPlayer.Info.GetVideoWidth()}x{mediaPlayer.Info.GetVideoHeight()}");
    }

    /// <summary>
    /// 开始跳转
    /// </summary>
    private void OnStartedSeeking()
    {
        Debug.Log("开始跳转播放位置");
    }

    /// <summary>
    /// 跳转完成
    /// </summary>
    private void OnFinishedSeeking()
    {
        Debug.Log("跳转完成");
    }

    /// <summary>
    /// 开始缓冲
    /// </summary>
    private void OnStartedBuffering()
    {
        Debug.Log("开始缓冲...");
    }

    /// <summary>
    /// 缓冲完成
    /// </summary>
    private void OnFinishedBuffering()
    {
        Debug.Log("缓冲完成");
    }

    /// <summary>
    /// 属性改变
    /// </summary>
    private void OnPropertiesChanged()
    {
        Debug.Log("视频属性改变");
    }

    /// <summary>
    /// 播放列表项改变
    /// </summary>
    private void OnPlaylistItemChanged()
    {
        Debug.Log("播放列表项改变");
    }

    /// <summary>
    /// 播放列表完成
    /// </summary>
    private void OnPlaylistFinished()
    {
        Debug.Log("播放列表播放完成");
    }

    #endregion

    #region 公共控制方法

    /// <summary>
    /// 加载视频
    /// </summary>
    public void LoadVideo()
    {
        if (mediaPlayer != null && !string.IsNullOrEmpty(videoPath))
        {
            mediaPlayer.OpenMedia(new MediaPath(videoPath, MediaPathType.RelativeToStreamingAssetsFolder), autoPlay);
            Debug.Log($"正在加载视频: {videoPath}");
        }
    }

    /// <summary>
    /// 加载指定路径的视频
    /// </summary>
    public void LoadVideo(string path, MediaPathType pathType = MediaPathType.RelativeToStreamingAssetsFolder)
    {
        if (mediaPlayer != null && !string.IsNullOrEmpty(path))
        {
            mediaPlayer.OpenMedia(new MediaPath(path, pathType), autoPlay);
            Debug.Log($"正在加载视频: {path}");
        }
    }

    /// <summary>
    /// 播放视频
    /// </summary>
    public void Play()
    {
        if (mediaPlayer != null && mediaPlayer.Control != null)
        {
            mediaPlayer.Play();
        }
    }

    /// <summary>
    /// 暂停视频
    /// </summary>
    public void Pause()
    {
        if (mediaPlayer != null && mediaPlayer.Control != null)
        {
            mediaPlayer.Pause();
        }
    }

    /// <summary>
    /// 停止视频
    /// </summary>
    public void Stop()
    {
        if (mediaPlayer != null && mediaPlayer.Control != null)
        {
            mediaPlayer.Stop();
        }
    }

    /// <summary>
    /// 关闭视频
    /// </summary>
    public void Close()
    {
        if (mediaPlayer != null)
        {
            mediaPlayer.CloseMedia();
        }
    }

    /// <summary>
    /// 跳转到指定时间(秒)
    /// </summary>
    public void SeekToTime(float timeInSeconds)
    {
        if (mediaPlayer != null && mediaPlayer.Control != null)
        {
            mediaPlayer.Control.Seek(timeInSeconds);
        }
    }

    /// <summary>
    /// 设置音量 (0-1)
    /// </summary>
    public void SetVolume(float volume)
    {
        if (mediaPlayer != null && mediaPlayer.Control != null)
        {
            mediaPlayer.AudioVolume = volume;
        }
    }

    /// <summary>
    /// 设置播放速度
    /// </summary>
    public void SetPlaybackRate(float rate)
    {
        if (mediaPlayer != null && mediaPlayer.Control != null)
        {
            mediaPlayer.Control.SetPlaybackRate(rate);
        }
    }

    /// <summary>
    /// 获取当前播放时间(秒)
    /// </summary>
    public float GetCurrentTime()
    {
        if (mediaPlayer != null && mediaPlayer.Control != null)
        {
            return (float)mediaPlayer.Control.GetCurrentTime();
        }
        return 0f;
    }

    /// <summary>
    /// 获取视频总时长(秒)
    /// </summary>
    public float GetDuration()
    {
        if (mediaPlayer != null && mediaPlayer.Info != null)
        {
            return (float)mediaPlayer.Info.GetDuration();
        }
        return 0f;
    }

    /// <summary>
    /// 判断是否正在播放
    /// </summary>
    public bool IsPlaying()
    {
        //视频播放完后停留在最后的时候,还是会显示播放状态为true,bug!!!
        return mediaPlayer != null && mediaPlayer.Control != null && mediaPlayer.Control.IsPlaying();
    }

    #endregion

    #region Update方法 - 用于实时监控

    private void Update()
    {
        // 可以在这里添加实时监控逻辑
        // 例如更新进度条、显示当前时间等

        if (mediaPlayer != null && mediaPlayer.Control != null && mediaPlayer.Control.IsPlaying())
        {
            // 获取当前播放进度
            float currentTime = GetCurrentTime();
            float duration = GetDuration();

            if (duration > 0)
            {
                float progress = currentTime / duration;
                // 这里可以更新UI进度条
                // progressSlider.value = progress;
            }
        }








        #region 测试
        if (Input.GetKeyDown(KeyCode.F))
        {
            mediaPlayer.Play();
        }
        if (Input.GetKeyDown(KeyCode.G))
        {
            mediaPlayer.Pause();
        }
        if (Input.GetKeyDown(KeyCode.H))
        {
            mediaPlayer.Stop();
        }
        if (Input.GetKeyDown(KeyCode.J))
        {
            mediaPlayer.CloseMedia();
        }
        if (Input.GetKeyDown(KeyCode.K))
        {
            if (GetCurrentTime()+5.0f<GetDuration())
            {
                SeekToTime(GetCurrentTime() + 5.0f);
            }
        }
        if (Input.GetKeyDown(KeyCode.L))
        {
            SetPlaybackRate(3);
        }
        if (Input.GetKeyDown(KeyCode.P))
        {
            SetPlaybackRate(1);
        }
        if (Input.GetKeyDown(KeyCode.O))
        {
            mediaPlayer.Rewind(false);
            mediaPlayer.Play();
        }
        if (Input.GetKeyDown(KeyCode.I))
        {
            SetVolume(mediaPlayer.AudioVolume+0.01f);
        }
        if (Input.GetKeyDown(KeyCode.U))
        {
            IsPlaying();
        }
        #endregion
    }

    #endregion
}
相关推荐
wuk9983 小时前
基于帧差分法的视频运动检测MATLAB实现
开发语言·matlab·音视频
by__csdn3 小时前
第二章 (.NET Core环境搭建)第二节( Visual Studio Code)
ide·vscode·c#·vue·asp.net·.net·.netcore
by__csdn4 小时前
第二章 (.NET Core环境搭建)第三节( Visual Studio for Mac)
ide·kubernetes·c#·asp.net·.net·.netcore·visual studio
c#上位机16 小时前
halcon图像增强——emphasize
图像处理·人工智能·计算机视觉·c#·上位机·halcon
世洋Blog16 小时前
Unity中图片的内存中占用大小、AB占用大小、内存形式
unity·游戏引擎
熬夜敲代码的小N16 小时前
Unity热更新技术详解
unity·游戏引擎
Yutengii17 小时前
b站视频下载到电脑本地的方法有哪些
音视频
zxy284722530117 小时前
C#的视觉库Halcon入门示例
c#·图像识别·halcon·机器视觉
summerkissyou198719 小时前
Android13-Audio-AudioTrack-播放流程
android·音视频