视频控制类脚本,可实现多视频切换,播放、暂停、控制视频进度、视频音量、显示视频提示信息等功能
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RenderHeads.Media.AVProVideo;
using UnityEngine.UI;
public class My_VideoController : MonoBehaviour
{
[Header("视频播放器")]
public MediaPlayer _mediaPlayer_A;
public MediaPlayer _mediaPlayer_B;
public MediaPlayer _mediaPlayer_C;
private MediaPlayer PlayingPlayer;
private MediaPlayer _loadingPlayer;
[Header("视频显示器")]
public DisplayUGUI _avProVideo;
[Header("视频进度条")]
public Slider _videoSeekSlider;
[Header("视频时间显示文本")]
public Text VideoTime_Text;
[Header("播放/暂停按钮")]
public Button Play_Button;
private bool isFirstClick_PlayButton;
[Header("上一个视频按钮")]
public Button Last_Button;
[Header("下一个视频按钮")]
public Button Next_Button;
[Header("视频音量滑动条")]
public Slider AudioVolumeSlider;
private float _customVolume;
[Header("静音开关")]
public Toggle _muteToggle;
[Header("提示文本")]
public Text Tip_Txt;
[Header("视频路径的获取方式")]
public MediaPlayer.FileLocation _location = MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder;
[Header("视频路径的前半段")]
public string _folder = "AVProVideoSamples/";
[Header("视频路径")]
public string[] _videoFiles = { "BigBuckBunny_720p30.mp4", "SampleSphere.mp4", "Sample180.mp4" };
private int _VideoIndex = 0;
private void Awake()
{
PlayingPlayer = _mediaPlayer_A;
_loadingPlayer = _mediaPlayer_B;
PlayingPlayer.m_VideoPath = System.IO.Path.Combine(_folder, _videoFiles[_VideoIndex]);
PlayingPlayer.OpenVideoFromFile(_location, PlayingPlayer.m_VideoPath, true);
}
void Start()
{
_videoSeekSlider.onValueChanged.AddListener(this.On_videoSeekSlider_Change);
Last_Button.onClick.AddListener(() => { Click_Last_or_Next_Button(Last_Button); });
Next_Button.onClick.AddListener(() => { Click_Last_or_Next_Button(Next_Button); });
AudioVolumeSlider.onValueChanged.AddListener(this.On_AudioVolumeSlider_Change);
_muteToggle.onValueChanged.AddListener(this.OnMuteToggleClick);
Play_Button.onClick.AddListener(this.Click_PlayOrPause_Button);
}
void Update()
{
DoUpdate_VideoProcess();
UpdateTimeText();
}
private void On_videoSeekSlider_Change(float value)
{
float tVideoTime = PlayingPlayer.Info.GetDurationMs();
float tCurrentTime = _videoSeekSlider.value * tVideoTime;
PlayingPlayer.Control.Seek(tCurrentTime);
}
public void On_videoSeekSlider_DragBegin()
{
PlayingPlayer.Control.Pause();
}
public void On_videoSeekSlider_DragEnd()
{
PlayingPlayer.Control.Play();
}
private void DoUpdate_VideoProcess()
{
float tCurrentTime = PlayingPlayer.Control.GetCurrentTimeMs();
float tVideoTime = PlayingPlayer.Info.GetDurationMs();
if (tVideoTime > 0)
{
_videoSeekSlider.value = tCurrentTime / tVideoTime;
}
}
private void UpdateTimeText()
{
int tCurrentSeconds = (int)PlayingPlayer.Control.GetCurrentTimeMs() / 1000;
int tCurrentMin = tCurrentSeconds / 60;
tCurrentSeconds = tCurrentSeconds % 60;
string tCurrentSecondStr = tCurrentSeconds < 10 ? "0" + tCurrentSeconds : tCurrentSeconds.ToString();
int tVideoTimeSeconds = (int)PlayingPlayer.Info.GetDurationMs() / 1000;
int tVideoTimeMin = tVideoTimeSeconds / 60;
tVideoTimeSeconds = tVideoTimeSeconds % 60;
string tVideoTimeSecondStr = tVideoTimeSeconds < 10 ? "0" + tVideoTimeSeconds : tVideoTimeSeconds.ToString();
string tTime = string.Format("<color=white>{0}:{1} / {2}:{3}</color>", tCurrentMin, tCurrentSecondStr, tVideoTimeMin, tVideoTimeSecondStr);
VideoTime_Text.text = tTime;
}
private void Click_Last_or_Next_Button(Button btn)
{
if (btn == Last_Button)
{
if (_VideoIndex >= 1 && _VideoIndex <= 2)
{
_VideoIndex--;
OnOpenVideoFile();
}
else
{
Tip_Txt.gameObject.SetActive(true);
Tip_Txt.text = "前面已经没有视频了!!!";
Invoke("Hide_Tip_Txt", 1.5f);
}
}
else if (btn == Next_Button)
{
if (_VideoIndex >= 0 && _VideoIndex <= 1)
{
_VideoIndex++;
OnOpenVideoFile();
}
else
{
Tip_Txt.gameObject.SetActive(true);
Tip_Txt.text = "后面已经没有视频了!!!";
Invoke("Hide_Tip_Txt", 1.5f);
}
}
}
private void OnOpenVideoFile()
{
if (_VideoIndex == 0)
{
_loadingPlayer = _mediaPlayer_B;
}
else if (_VideoIndex == 1)
{
_loadingPlayer = _mediaPlayer_C;
}
else if (_VideoIndex == 2)
{
_loadingPlayer = _mediaPlayer_A;
}
_loadingPlayer.m_VideoPath = System.IO.Path.Combine(_folder, _videoFiles[_VideoIndex]);
_loadingPlayer.OpenVideoFromFile(_location, _loadingPlayer.m_VideoPath, true);
PlayingPlayer = _loadingPlayer;
_avProVideo.CurrentMediaPlayer = PlayingPlayer;
}
private void Hide_Tip_Txt()
{
Tip_Txt.gameObject.SetActive(false);
}
private void On_AudioVolumeSlider_Change(float value)
{
if (value != 0)
{
_customVolume = AudioVolumeSlider.value;
}
PlayingPlayer.Control.SetVolume(value);
if (value > 0)
{
_muteToggle.isOn = false;
}
else
{
_muteToggle.isOn = true;
}
}
private void OnMuteToggleClick(bool s_isOn)
{
if (s_isOn)
{
AudioVolumeSlider.value = 0;
PlayingPlayer.Control.SetVolume(0);
}
else
{
AudioVolumeSlider.value = _customVolume;
PlayingPlayer.Control.SetVolume(_customVolume);
}
}
private void Click_PlayOrPause_Button()
{
if (isFirstClick_PlayButton)
{
isFirstClick_PlayButton = false;
PlayingPlayer.Control.Play();
Play_Button.transform.GetChild(0).GetComponent<Text>().text = "播放";
}
else
{
isFirstClick_PlayButton = true;
PlayingPlayer.Control.Pause();
Play_Button.transform.GetChild(0).GetComponent<Text>().text = "暂停";
}
}
}