420 lines
14 KiB
C#
420 lines
14 KiB
C#
#if UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_5 || UNITY_5_4_OR_NEWER
|
||
#define UNITY_FEATURE_UGUI
|
||
#endif
|
||
|
||
using UnityEngine;
|
||
#if UNITY_FEATURE_UGUI
|
||
using UnityEngine.UI;
|
||
using System.Collections;
|
||
using RenderHeads.Media.AVProVideo;
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Copyright 2015-2018 RenderHeads Ltd. All rights reserverd.
|
||
//-----------------------------------------------------------------------------
|
||
|
||
namespace RenderHeads.Media.AVProVideo.Demos
|
||
{
|
||
/// <summary>
|
||
/// A demo of a simple video player using uGUI for display
|
||
/// Uses two MediaPlayer components, with one displaying the current video
|
||
/// while the other loads the next video. MediaPlayers are then swapped
|
||
/// once the video is loaded and has a frame available for display.
|
||
/// This gives a more seamless display than simply using a single MediaPlayer
|
||
/// as its texture will be destroyed when it loads a new video
|
||
/// </summary>
|
||
public class VCR : MonoBehaviour
|
||
{
|
||
public MediaPlayer _mediaPlayer;
|
||
public MediaPlayer _mediaPlayerB;
|
||
public DisplayUGUI _mediaDisplay;
|
||
public RectTransform _bufferedSliderRect;
|
||
|
||
public Slider _videoSeekSlider;
|
||
private float _setVideoSeekSliderValue;
|
||
private bool _wasPlayingOnScrub;
|
||
|
||
public Slider _audioVolumeSlider;
|
||
private float _setAudioVolumeSliderValue;
|
||
|
||
public Toggle _AutoStartToggle;
|
||
public Toggle _MuteToggle;
|
||
|
||
public MediaPlayer.FileLocation _location = MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder;
|
||
public string _folder = "AVProVideoDemos/";
|
||
public string[] _videoFiles = { "BigBuckBunny_720p30.mp4", "SampleSphere.mp4" };
|
||
|
||
private int _VideoIndex = 0;
|
||
private Image _bufferedSliderImage;
|
||
|
||
private MediaPlayer _loadingPlayer;
|
||
|
||
|
||
|
||
public MediaPlayer PlayingPlayer
|
||
{
|
||
get
|
||
{
|
||
if (LoadingPlayer == _mediaPlayer)
|
||
{
|
||
return _mediaPlayerB;
|
||
}
|
||
return _mediaPlayer;
|
||
}
|
||
}
|
||
|
||
public MediaPlayer LoadingPlayer
|
||
{
|
||
get
|
||
{
|
||
return _loadingPlayer;
|
||
}
|
||
}
|
||
|
||
private void SwapPlayers()
|
||
{
|
||
// Pause the previously playing video
|
||
PlayingPlayer.Control.Pause();
|
||
|
||
// Swap the videos
|
||
if (LoadingPlayer == _mediaPlayer)
|
||
{
|
||
_loadingPlayer = _mediaPlayerB;
|
||
}
|
||
else
|
||
{
|
||
_loadingPlayer = _mediaPlayer;
|
||
}
|
||
|
||
// Change the displaying video
|
||
_mediaDisplay.CurrentMediaPlayer = PlayingPlayer;
|
||
}
|
||
|
||
public void OnOpenVideoFile()
|
||
{
|
||
Debug.Log(System.IO.Path.Combine(_folder, _videoFiles[_VideoIndex]));
|
||
LoadingPlayer.m_VideoPath = System.IO.Path.Combine(_folder, _videoFiles[_VideoIndex]);
|
||
_VideoIndex = (_VideoIndex + 1) % (_videoFiles.Length);
|
||
if (string.IsNullOrEmpty(LoadingPlayer.m_VideoPath))
|
||
{
|
||
LoadingPlayer.CloseVideo();
|
||
_VideoIndex = 0;
|
||
}
|
||
else
|
||
{
|
||
LoadingPlayer.OpenVideoFromFile(_location, LoadingPlayer.m_VideoPath, _AutoStartToggle.isOn);
|
||
// SetButtonEnabled( "PlayButton", !_mediaPlayer.m_AutoStart );
|
||
// SetButtonEnabled( "PauseButton", _mediaPlayer.m_AutoStart );
|
||
}
|
||
|
||
if (_bufferedSliderRect != null)
|
||
{
|
||
_bufferedSliderImage = _bufferedSliderRect.GetComponent<Image>();
|
||
}
|
||
}
|
||
|
||
public void OnAutoStartChange()
|
||
{
|
||
if (PlayingPlayer &&
|
||
_AutoStartToggle && _AutoStartToggle.enabled &&
|
||
PlayingPlayer.m_AutoStart != _AutoStartToggle.isOn)
|
||
{
|
||
PlayingPlayer.m_AutoStart = _AutoStartToggle.isOn;
|
||
}
|
||
if (LoadingPlayer &&
|
||
_AutoStartToggle && _AutoStartToggle.enabled &&
|
||
LoadingPlayer.m_AutoStart != _AutoStartToggle.isOn)
|
||
{
|
||
LoadingPlayer.m_AutoStart = _AutoStartToggle.isOn;
|
||
}
|
||
}
|
||
|
||
public void OnMuteChange()
|
||
{
|
||
if (PlayingPlayer)
|
||
{
|
||
PlayingPlayer.Control.MuteAudio(_MuteToggle.isOn);
|
||
}
|
||
if (LoadingPlayer)
|
||
{
|
||
LoadingPlayer.Control.MuteAudio(_MuteToggle.isOn);
|
||
}
|
||
}
|
||
|
||
public void OnPlayButton()
|
||
{
|
||
if (PlayingPlayer)
|
||
{
|
||
PlayingPlayer.Control.Play();
|
||
// SetButtonEnabled( "PlayButton", false );
|
||
// SetButtonEnabled( "PauseButton", true );
|
||
}
|
||
}
|
||
public void OnPauseButton()
|
||
{
|
||
if (PlayingPlayer)
|
||
{
|
||
PlayingPlayer.Control.Pause();
|
||
// SetButtonEnabled( "PauseButton", false );
|
||
// SetButtonEnabled( "PlayButton", true );
|
||
}
|
||
}
|
||
|
||
public void OnVideoSeekSlider()
|
||
{
|
||
if (PlayingPlayer && _videoSeekSlider && _videoSeekSlider.value != _setVideoSeekSliderValue)
|
||
{
|
||
PlayingPlayer.Control.Seek(_videoSeekSlider.value * PlayingPlayer.Info.GetDurationMs());
|
||
}
|
||
}
|
||
|
||
public void OnVideoSliderDown()
|
||
{
|
||
if (PlayingPlayer)
|
||
{
|
||
_wasPlayingOnScrub = PlayingPlayer.Control.IsPlaying();
|
||
if (_wasPlayingOnScrub)
|
||
{
|
||
PlayingPlayer.Control.Pause();
|
||
// SetButtonEnabled( "PauseButton", false );
|
||
// SetButtonEnabled( "PlayButton", true );
|
||
}
|
||
OnVideoSeekSlider();
|
||
}
|
||
}
|
||
public void OnVideoSliderUp()
|
||
{
|
||
if (PlayingPlayer && _wasPlayingOnScrub)
|
||
{
|
||
PlayingPlayer.Control.Play();
|
||
_wasPlayingOnScrub = false;
|
||
|
||
// SetButtonEnabled( "PlayButton", false );
|
||
// SetButtonEnabled( "PauseButton", true );
|
||
}
|
||
}
|
||
|
||
public void OnAudioVolumeSlider()
|
||
{
|
||
if (PlayingPlayer && _audioVolumeSlider && _audioVolumeSlider.value != _setAudioVolumeSliderValue)
|
||
{
|
||
PlayingPlayer.Control.SetVolume(_audioVolumeSlider.value);
|
||
}
|
||
if (LoadingPlayer && _audioVolumeSlider && _audioVolumeSlider.value != _setAudioVolumeSliderValue)
|
||
{
|
||
LoadingPlayer.Control.SetVolume(_audioVolumeSlider.value);
|
||
}
|
||
}
|
||
// public void OnMuteAudioButton()
|
||
// {
|
||
// if( _mediaPlayer )
|
||
// {
|
||
// _mediaPlayer.Control.MuteAudio( true );
|
||
// SetButtonEnabled( "MuteButton", false );
|
||
// SetButtonEnabled( "UnmuteButton", true );
|
||
// }
|
||
// }
|
||
// public void OnUnmuteAudioButton()
|
||
// {
|
||
// if( _mediaPlayer )
|
||
// {
|
||
// _mediaPlayer.Control.MuteAudio( false );
|
||
// SetButtonEnabled( "UnmuteButton", false );
|
||
// SetButtonEnabled( "MuteButton", true );
|
||
// }
|
||
// }
|
||
|
||
public void OnRewindButton()
|
||
{
|
||
if (PlayingPlayer)
|
||
{
|
||
PlayingPlayer.Control.Rewind();
|
||
}
|
||
}
|
||
|
||
|
||
public Button multiplyPlaybackBtn;
|
||
public Button[] multiplyButtons;
|
||
public GameObject multiplyTogglesParents;
|
||
public bool isMultiplyOn = false;
|
||
|
||
public void ResetPlayState()
|
||
{
|
||
isMultiplyOn = false;
|
||
multiplyTogglesParents.SetActive(false);
|
||
multiplyPlaybackBtn.transform.GetChild(0).GetComponent<Text>().text = "×1";
|
||
}
|
||
/// <summary>
|
||
/// 倍数播放
|
||
/// </summary>
|
||
|
||
private void Awake()
|
||
{
|
||
_loadingPlayer = _mediaPlayerB;
|
||
}
|
||
|
||
void Start()
|
||
{
|
||
multiplyPlaybackBtn.onClick.AddListener(() =>
|
||
{
|
||
isMultiplyOn = !isMultiplyOn;
|
||
multiplyTogglesParents.SetActive(isMultiplyOn);
|
||
});
|
||
|
||
for (int i = 0; i < multiplyButtons.Length; i++)
|
||
{
|
||
int index = i;
|
||
multiplyButtons[index].onClick.AddListener(() =>
|
||
{
|
||
multiplyPlaybackBtn.transform.GetChild(0).GetComponent<Text>().text = "×" + multiplyButtons[index].name;
|
||
float temp = float.Parse(multiplyButtons[index].name);
|
||
if (PlayingPlayer)
|
||
PlayingPlayer.Control.SetPlaybackRate(temp);
|
||
isMultiplyOn = false;
|
||
multiplyTogglesParents.SetActive(false);
|
||
});
|
||
|
||
}
|
||
ResetPlayState();
|
||
if (PlayingPlayer)
|
||
{
|
||
PlayingPlayer.Events.AddListener(OnVideoEvent);
|
||
|
||
if (LoadingPlayer)
|
||
{
|
||
LoadingPlayer.Events.AddListener(OnVideoEvent);
|
||
}
|
||
|
||
if (_audioVolumeSlider)
|
||
{
|
||
// Volume
|
||
if (PlayingPlayer.Control != null)
|
||
{
|
||
float volume = PlayingPlayer.Control.GetVolume();
|
||
_setAudioVolumeSliderValue = volume;
|
||
_audioVolumeSlider.value = volume;
|
||
}
|
||
}
|
||
|
||
// Auto start toggle
|
||
_AutoStartToggle.isOn = PlayingPlayer.m_AutoStart;
|
||
|
||
if (PlayingPlayer.m_AutoOpen)
|
||
{
|
||
// RemoveOpenVideoButton();
|
||
|
||
// SetButtonEnabled( "PlayButton", !_mediaPlayer.m_AutoStart );
|
||
// SetButtonEnabled( "PauseButton", _mediaPlayer.m_AutoStart );
|
||
}
|
||
else
|
||
{
|
||
// SetButtonEnabled( "PlayButton", false );
|
||
// SetButtonEnabled( "PauseButton", false );
|
||
}
|
||
|
||
// SetButtonEnabled( "MuteButton", !_mediaPlayer.m_Muted );
|
||
// SetButtonEnabled( "UnmuteButton", _mediaPlayer.m_Muted );
|
||
|
||
OnOpenVideoFile();
|
||
}
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
if (PlayingPlayer && PlayingPlayer.Info != null && PlayingPlayer.Info.GetDurationMs() > 0f)
|
||
{
|
||
float time = PlayingPlayer.Control.GetCurrentTimeMs();
|
||
float duration = PlayingPlayer.Info.GetDurationMs();
|
||
float d = Mathf.Clamp(time / duration, 0.0f, 1.0f);
|
||
|
||
// Debug.Log(string.Format("time: {0}, duration: {1}, d: {2}", time, duration, d));
|
||
|
||
_setVideoSeekSliderValue = d;
|
||
_videoSeekSlider.value = d;
|
||
|
||
if (_bufferedSliderRect != null)
|
||
{
|
||
float t1 = 0f;
|
||
float t2 = PlayingPlayer.Control.GetBufferingProgress();
|
||
if (t2 <= 0f)
|
||
{
|
||
if (PlayingPlayer.Control.GetBufferedTimeRangeCount() > 0)
|
||
{
|
||
PlayingPlayer.Control.GetBufferedTimeRange(0, ref t1, ref t2);
|
||
t1 /= PlayingPlayer.Info.GetDurationMs();
|
||
t2 /= PlayingPlayer.Info.GetDurationMs();
|
||
}
|
||
}
|
||
|
||
Vector2 anchorMin = Vector2.zero;
|
||
Vector2 anchorMax = Vector2.one;
|
||
|
||
if (_bufferedSliderImage != null &&
|
||
_bufferedSliderImage.type == Image.Type.Filled)
|
||
{
|
||
_bufferedSliderImage.fillAmount = d;
|
||
}
|
||
else
|
||
{
|
||
anchorMin[0] = t1;
|
||
anchorMax[0] = t2;
|
||
}
|
||
|
||
_bufferedSliderRect.anchorMin = anchorMin;
|
||
_bufferedSliderRect.anchorMax = anchorMax;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Callback function to handle events
|
||
public void OnVideoEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode errorCode)
|
||
{
|
||
switch (et)
|
||
{
|
||
case MediaPlayerEvent.EventType.ReadyToPlay:
|
||
break;
|
||
case MediaPlayerEvent.EventType.Started:
|
||
break;
|
||
case MediaPlayerEvent.EventType.FirstFrameReady:
|
||
SwapPlayers();
|
||
break;
|
||
case MediaPlayerEvent.EventType.FinishedPlaying:
|
||
break;
|
||
}
|
||
|
||
Debug.Log("Event: " + et.ToString());
|
||
}
|
||
|
||
// private void SetButtonEnabled( string objectName, bool bEnabled )
|
||
// {
|
||
// Button button = GameObject.Find( objectName ).GetComponent<Button>();
|
||
// if( button )
|
||
// {
|
||
// button.enabled = bEnabled;
|
||
// button.GetComponentInChildren<CanvasRenderer>().SetAlpha( bEnabled ? 1.0f : 0.4f );
|
||
// button.GetComponentInChildren<Text>().color = Color.clear;
|
||
// }
|
||
// }
|
||
|
||
// private void RemoveOpenVideoButton()
|
||
// {
|
||
// Button openVideoButton = GameObject.Find( "OpenVideoButton" ).GetComponent<Button>();
|
||
// if( openVideoButton )
|
||
// {
|
||
// openVideoButton.enabled = false;
|
||
// openVideoButton.GetComponentInChildren<CanvasRenderer>().SetAlpha( 0.0f );
|
||
// openVideoButton.GetComponentInChildren<Text>().color = Color.clear;
|
||
// }
|
||
//
|
||
// if( _AutoStartToggle )
|
||
// {
|
||
// _AutoStartToggle.enabled = false;
|
||
// _AutoStartToggle.isOn = false;
|
||
// _AutoStartToggle.GetComponentInChildren<CanvasRenderer>().SetAlpha( 0.0f );
|
||
// _AutoStartToggle.GetComponentInChildren<Text>().color = Color.clear;
|
||
// _AutoStartToggle.GetComponentInChildren<Image>().enabled = false;
|
||
// _AutoStartToggle.GetComponentInChildren<Image>().color = Color.clear;
|
||
// }
|
||
// }
|
||
}
|
||
}
|
||
#endif |