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

190 lines
5.1 KiB
C#

// 本脚本只在不存在时会生成一次。组件逻辑写在当前脚本内。已存在不会再次生成覆盖
using UnityEngine;
using FairyGUI;
using RenderHeads.Media.AVProVideo;
namespace NBF
{
public enum VideoPlayMode
{
Top,
Mid,
Bottom
}
public partial class VideoPlayer : GComponent
{
private VideoPlayerComponent _playerComponent;
private NTexture _texture;
public bool IsLoading => stageCtrl.selectedIndex == 0;
private VideoRetData _videoRetData;
public int VideoIndex { get; private set; }
private void OnInited()
{
BtnPause.onClick.Set(OnClickPause);
}
public void PlayVideo(int videoIndex, VideoPlayMode mode)
{
VideoIndex = videoIndex;
name = videoIndex.ToString();
gameObjectName = videoIndex.ToString();
if (VideoIndex < 0) return;
_videoRetData = Game.Instance.GetVideoDataByIndex(videoIndex);
if (_playerComponent != null)
{
StopVideo();
}
// stageCtrl.selectedIndex = 0;
// _videoRetData = videoRetData;
_playerComponent = VideoManager.Instance.GetPlayer(VideoIndex);
_playerComponent.VideoIndex = videoIndex;
_playerComponent.OnPlayStart += OnPlayStart;
_playerComponent.OnHandleEvent += OnHandleEvent;
var videoUrl = $"{Net.Instance.ServerUrl}/files/videos/{_videoRetData.FilePath}";
_playerComponent.ChangeVideo(videoUrl, mode == VideoPlayMode.Mid);
SetRt();
// _playerComponent =
}
public void StopVideo()
{
// var offset = _playerComponent.VideoIndex
// if(_playerComponent.VideoIndex)
_playerComponent.OnPlayStart -= OnPlayStart;
_playerComponent.OnHandleEvent -= OnHandleEvent;
}
protected override void OnUpdate()
{
base.OnUpdate();
UpdateTick();
}
public override void Dispose()
{
StopVideo();
// if (_texture != null)
// {
// _texture.Dispose();
// }
base.Dispose();
}
#region
private void OnHandleEvent(MediaPlayerEvent.EventType eventType)
{
if (isDisposed) return;
if (displayObject == null) return;
if (displayObject.gameObject == null) return;
if (eventType == MediaPlayerEvent.EventType.Paused)
{
pauseCtrl.selectedIndex = 1;
}
else if (eventType == MediaPlayerEvent.EventType.Unpaused)
{
pauseCtrl.selectedIndex = 0;
}
else if (eventType == MediaPlayerEvent.EventType.Started)
{
_watchCount = 1;
pauseCtrl.selectedIndex = 0;
stageCtrl.selectedIndex = 1;
StartedAnim.Play();
}
else if (eventType == MediaPlayerEvent.EventType.StartedSeeking)
{
_watchCount++;
Tick(); //重播时也上报tick
}
}
private void OnPlayStart(RenderTexture rt)
{
// if (_texture != null)
// {
// _texture.Dispose();
// }
//
// if (_playerComponent != null)
// {
// _texture = new NTexture(_playerComponent.NowRT);
// VideoVer.texture = _texture;
// }
if (_texture.width != rt.width || _texture.height != rt.height)
{
SetRt();
}
// _texture.width = rt.width;
// _texture.
stageCtrl.selectedIndex = 1;
}
private void SetRt()
{
if (_texture != null)
{
_texture.Dispose();
}
if (_playerComponent != null)
{
_texture = new NTexture(_playerComponent.NowRT)
{
destroyMethod = DestroyMethod.Custom
};
VideoVer.texture = _texture;
}
}
#endregion
#region
private void OnClickPause()
{
_playerComponent.TogglePlayPause();
}
#endregion
#region tick
private float _videoPlayTime;
private int _watchCount;
private void UpdateTick()
{
if (IsLoading) return;
if (_playerComponent.IsPlaying)
{
_videoPlayTime += Time.deltaTime;
if (_videoPlayTime >= 5)
{
Tick(); //5秒上报一次
}
}
}
private void Tick()
{
if (_videoRetData == null) return;
Net.Instance.Tick(_videoRetData.Id, (int)_videoPlayTime, _watchCount);
_watchCount = 0;
_videoPlayTime = 0;
}
#endregion
}
}