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
}
相关推荐
kylezhao20191 天前
C#winform数据绑定
c#
爱吃西红柿鸡蛋面1 天前
JsonHelper使用
c#
故事不长丨1 天前
C#线程编程全解析:从基础应用到高级实践
c#·线程·多线程·thread·线程同步·异步编程·线程锁
dualven_in_csdn1 天前
【视频优化研究】过程 记录
音视频
纽格立科技1 天前
2025全球DRM数字广播战略实施全景——印尼篇(地缘特征主导下的数字骨干网构建)
网络·科技·音视频·信息与通信·传媒
xiaowu0801 天前
C#调用 C++ DLL 加载地址方式选择
开发语言·c++·c#
Black蜡笔小新1 天前
全域互联:EasyCVR如何为多区域视频监控融合治理提供技术支持
音视频
非凡ghost1 天前
MPC-QT视频播放器(基于Qt框架播放器)
开发语言·windows·qt·音视频·软件需求
REDcker1 天前
Android WebView 版本升级方案详解
android·音视频·实时音视频·webview·js·编解码
昨日之日20061 天前
LTX-2 - 一键生成音视频,创作更轻松 支持50系显卡 ComfyUI工作流 一键整合包
人工智能·音视频·视频