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 |