181 lines
5.2 KiB
C#
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();
|
|
}
|
|
}
|
|
} |