using System; using System.Collections.Generic; using NBC; using RenderHeads.Media.AVProVideo; using UnityEngine; using UnityEngine.Serialization; using Object = UnityEngine.Object; namespace NBF { public class VideoManager : MonoBehaviour { public static VideoManager Instance { get; private set; } public float PlayProgress { get; private set; } = 0f; public GameObject prefab; /// /// 闲置的播放器 /// private readonly Queue _idlePlayers = new Queue(); /// /// 使用中的播放器 /// private readonly List _usePlayers = new List(); private void Awake() { Instance = this; } /// /// 获取一个播放器 /// /// public VideoPlayerComponent GetPlayer(int videoIndex) { var ret = _usePlayers.Find(t => t.VideoIndex == videoIndex); if (ret == null) { var playerObject = Instantiate(prefab, transform); ret = playerObject.GetComponent(); _usePlayers.Add(ret); } return ret; } /// /// 返回一个播放器 /// public void ReturnPlayer(int nowVideoIndex) { // _usePlayers.Remove(player); // _idlePlayers.Enqueue(player); List needRemove = new List(); foreach (var videoPlayerComponent in _usePlayers) { var offset = Math.Abs(videoPlayerComponent.VideoIndex - nowVideoIndex); if (offset > 1) { videoPlayerComponent.CloseMedia(); needRemove.Add(videoPlayerComponent); } } foreach (var videoPlayerComponent in needRemove) { _usePlayers.Remove(videoPlayerComponent); Destroy(videoPlayerComponent.gameObject); } } } // { // [SerializeField] private MediaPlayer _mediaPlayer; // // public static VideoManager Instance { get; private set; } // // 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() // { // Instance = this; // // DontDestroyOnLoad(gameObject); // // _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; // } // // 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.Started) // { // var width = mp.Info.GetVideoWidth(); // var height = mp.Info.GetVideoHeight(); // Log.Info("播放开始===="); // if (NowRT != null) // { // NowRT.Release(); // } // // NowRT = new RenderTexture(width, height, 0, RenderTextureFormat.ARGB32); // // 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) // { // _mediaPlayer.CloseMedia(); // _mediaPlayer.SetMediaPath(new MediaPath(url, MediaPathType.AbsolutePathOrURL)); // _mediaPlayer.OpenMedia(); // } // } }