using System; using NBC; using RenderHeads.Media.AVProVideo; using UnityEngine; namespace NBF { public class VideoPlayerComponent : MonoBehaviour { public int VideoIndex; [SerializeField] private MediaPlayer _mediaPlayer; public ResolveToRenderTexture ResolveToRenderTexture; public RenderTexture NowRT; public Action OnPlayStart; public Action OnHandleEvent; public float PlayProgress { get; private set; } = 0f; public bool IsPlaying => _mediaPlayer != null && _mediaPlayer.Control != null && _mediaPlayer.Control.IsPlaying(); private void Awake() { _mediaPlayer.Events.AddListener(HandleEvent); // Start adaptive stream using the highest resolution - ExoPlayer only _mediaPlayer.PlatformOptionsAndroid.videoApi = Android.VideoApi.ExoPlayer; _mediaPlayer.PlatformOptionsAndroid.startWithHighestBitrate = true; // Set the maximum adaptive resolution to 1080p - ExoPlayer only _mediaPlayer.PlatformOptionsAndroid.videoApi = Android.VideoApi.ExoPlayer; _mediaPlayer.PlatformOptionsAndroid.preferredMaximumResolution = MediaPlayer.OptionsAndroid.Resolution._1080p; NowRT = new RenderTexture(1080, 1920, 0, RenderTextureFormat.ARGB32); } private void Update() { if (!_mediaPlayer) return; if (_mediaPlayer.Info != null) { TimeRange timelineRange = GetTimelineRange(); double t = 0.0; if (timelineRange.duration > 0.0) { t = ((_mediaPlayer.Control.GetCurrentTime() - timelineRange.startTime) / timelineRange.duration); } PlayProgress = Mathf.Clamp01((float)t); } } #region 事件 void HandleEvent(MediaPlayer mp, MediaPlayerEvent.EventType eventType, ErrorCode code) { Debug.Log("MediaPlayer " + mp.name + " generated event: " + eventType.ToString()); OnHandleEvent?.Invoke(eventType); if (eventType == MediaPlayerEvent.EventType.Error) { Debug.LogError("Error: " + code); } else if (eventType == MediaPlayerEvent.EventType.MetaDataReady) { Log.Info("播放数据已准备===="); } else if (eventType == MediaPlayerEvent.EventType.ReadyToPlay) { Log.Info("播放数据已准备===="); } else if (eventType == MediaPlayerEvent.EventType.Started) { Log.Info("播放开始===="); var width = mp.Info.GetVideoWidth(); var height = mp.Info.GetVideoHeight(); NowRT.width = width; NowRT.height = height; ResolveToRenderTexture.ExternalTexture = NowRT; OnPlayStart?.Invoke(NowRT); } } #endregion #region 播放控制 public void TogglePlayPause() { if (_mediaPlayer && _mediaPlayer.Control != null) { if (_mediaPlayer.Control.IsPlaying()) { Pause(); } else { Play(); } } } public void Play() { if (_mediaPlayer && _mediaPlayer.Control != null) { _mediaPlayer.Play(); #if UNITY_ANDROID || UNITY_OPENHARMONY Screen.sleepTimeout = SleepTimeout.NeverSleep; #endif } } public void Pause() { if (_mediaPlayer && _mediaPlayer.Control != null) { _mediaPlayer.Pause(); #if UNITY_ANDROID || UNITY_OPENHARMONY Screen.sleepTimeout = SleepTimeout.SystemSetting; #endif } } #endregion private TimeRange GetTimelineRange() { if (_mediaPlayer.Info != null) { return Helper.GetTimelineRange(_mediaPlayer.Info.GetDuration(), _mediaPlayer.Control.GetSeekableTimes()); } return new TimeRange(); } public void ChangeVideo(string url, bool isAutoPlay) { if (isAutoPlay) { _mediaPlayer.AudioVolume = 1; } else { _mediaPlayer.AudioVolume = 0; } if (_mediaPlayer.MediaPath != null && !_mediaPlayer.MediaPath.Path.Equals(url)) { _mediaPlayer.CloseMedia(); _mediaPlayer.SetMediaPath(new MediaPath(url, MediaPathType.AbsolutePathOrURL)); _mediaPlayer.OpenMedia(isAutoPlay); } else if (isAutoPlay) { _mediaPlayer.Play(); } else { _mediaPlayer.Stop(); } } public void CloseMedia() { _mediaPlayer.Stop(); _mediaPlayer.CloseMedia(); } } }