Files
BabyVideo/Assets/Scripts/Common/VideoPlayerComponent.cs
2026-02-12 22:15:15 +08:00

181 lines
5.2 KiB
C#

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<RenderTexture> OnPlayStart;
public Action<MediaPlayerEvent.EventType> 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();
}
}
}