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
}
相关推荐
OpenCutAI9 分钟前
无字幕视频怎么翻译?跨境出海视频本地化实操指南
音视频
科技小E2 小时前
国标GB28181视频平台EasyGBS监控为什么会“瞎”:视频质量诊断EasyVQD如何揪出黑屏卡顿偏色
大数据·人工智能·音视频
半亩码田2 小时前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
ACP广源盛139246256734 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 Serdes 长距离视频传输芯片 GSV5800 在私有化 AI 服务中的价值与应用场景
大数据·数据库·人工智能·嵌入式硬件·矩阵·开源·音视频
深圳市宝华视联6 小时前
院感约束下,手术室音视频布线与设备摆放实施注意事项
嵌入式硬件·音视频·实时音视频·视频编解码·嵌入式实时数据库
东莞市奥普新音频技术有限公司7 小时前
国产音频分析仪怎么选?从性能参数、测试软件到自动化能力
人工智能·科技·测试工具·自动化·音视频·音频
hz567897 小时前
视频会议终端的核心功能与采购指南
运维·音视频·信息与通信·智能硬件
楠楠子呀7 小时前
独立站聊天转化全链路:从二维码引流到数据复盘
java·javascript·数据仓库·python·c#·自动化·etl
美狐美颜sdk7 小时前
从开发角度分析直播APP:视频美颜SDK接入过程中的技术难点
大数据·人工智能·音视频·美颜sdk·美颜api