一:界面展示

功能鍵有:播放/暫停,是否循環(huán)播放,音量控制,倍速控制,視頻切換,后退前進(jìn),顯示時間。
二:unity面板

將對應(yīng)內(nèi)容拖到對應(yīng)位置即可。
三:代碼
using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class VideoController : MonoBehaviour
{
//持有控制視頻播放的組件
public MediaPlayer mediaPlayer;
//持有播放暫停切換開關(guān)
public Toggle m_videoToggle;
//持有是否循環(huán)播放開關(guān)
public Toggle m_loopToggle;
//持有控制播放速度的下拉列表
public Dropdown m_playSpeedDropdown;
//持有控制視頻播放進(jìn)度的進(jìn)度條
public Slider m_processSlider;
//持有顯示當(dāng)前播放與總播放的時間顯示
public Text m_videoTimeTex;
//持有返回幾秒前按鈕
public Button m_backSecondsBtn;
//設(shè)置每次點(diǎn)擊返回的秒數(shù)
private float m_backSeconds = 3f;
//持有控制音量的Slider
public Slider m_volumeSlider;
//持有靜音開關(guān)
public Toggle m_muteToggle;
//存儲靜音狀態(tài)前用戶設(shè)置的音量
private float m_customVolume;
//切換為上一個視頻,下一個視頻
public Button lastBtn;
public Button nextBtn;
[Header("視頻名稱")]
string[] VideoNames;
//初始化
void Awake()
{
//視頻名稱的路徑
VideoNames = File.ReadAllLines(Application.streamingAssetsPath + "/name.txt");
#region 事件監(jiān)聽
//注冊播放暫停開關(guān)事件
m_videoToggle.onValueChanged.AddListener(DoPlayOrPause);
//注冊是否循環(huán)播放開關(guān)事件
m_loopToggle.onValueChanged.AddListener(DoSetLoop);
//注冊控制速度的滾動天觸發(fā)事件
//添加下拉列表選項(xiàng)
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "2倍速"));
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "1.5倍速"));
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "1倍速"));
m_playSpeedDropdown.options.Add(new Dropdown.OptionData( "0.5倍"));
//設(shè)置初始速度顯示值,默認(rèn)為1倍速
m_playSpeedDropdown.value = 2;
m_playSpeedDropdown.captionText.text = m_playSpeedDropdown.options[2].text;
//注冊控制速度的下拉列表觸發(fā)事件
m_playSpeedDropdown.onValueChanged.AddListener(DoChangeSpeed);
//注冊視頻播放進(jìn)度條值改變觸發(fā)事件
m_processSlider.onValueChanged.AddListener(OnProcessSliderChange);
//注冊返回n幾秒前按鈕觸發(fā)事件
m_backSecondsBtn.onClick.AddListener(OnBackSecondsClick);
//注冊音量Slider事件
m_volumeSlider.onValueChanged.AddListener(OnVolumeSliderChange);
//注冊靜音開關(guān)事件
m_muteToggle.onValueChanged.AddListener(OnMuteToggleClick);
//注冊視頻播放觸發(fā)事件
mediaPlayer.Events.AddListener(MediaEventHandler);
//上一個按鈕監(jiān)聽
lastBtn.onClick.AddListener(LastVideo);
//下一個按鈕監(jiān)聽
nextBtn.onClick.AddListener(NextVideo);
#endregion
}
// 視頻播放時間觸發(fā)
private void MediaEventHandler(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
{
switch (arg1)
{
case MediaPlayerEvent .EventType .Closing :
Debug.Log("關(guān)閉播放器觸發(fā)");
break;
case MediaPlayerEvent .EventType .Error :
Debug.Log("報(bào)錯誤時觸發(fā)");
break;
case MediaPlayerEvent .EventType .FinishedPlaying ://注意:如果視頻設(shè)置為循環(huán)播放模式,則不觸發(fā)此項(xiàng)
Debug.Log("播放完成觸發(fā)");
break;
case MediaPlayerEvent .EventType .FirstFrameReady :
Debug.Log("準(zhǔn)備完觸發(fā)");
break;
case MediaPlayerEvent.EventType.MetaDataReady:
Debug.Log("媒體數(shù)據(jù)準(zhǔn)備準(zhǔn)備中觸發(fā)");
break;
case MediaPlayerEvent .EventType .ReadyToPlay :
Debug.Log("準(zhǔn)備去播放觸發(fā)");
break;
case MediaPlayerEvent .EventType .Started ://注意:每暫停之后的開始播放都會觸發(fā)一次
Debug.Log("開始播放觸發(fā)");
break;
default :
break;
}
}
void Start ()
{
LoadVideo();
//初始化觸發(fā)一次(同步聲音大小)
OnVolumeSliderChange(m_volumeSlider .value);
}
void Update()
{
//時刻更新播放進(jìn)度方法
DoUpdateVideoProcess();
//時刻更新播放時間顯示方法
UpdateTimeText();
}
// 加載視頻方法
int index = 0;
void LoadVideo()
{
//通過插件中的方法加載(參數(shù)為:1.加載路徑格式(與面板上相對應(yīng))2.加載的文件名 3.默認(rèn)是否開始播放)
mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, VideoNames[index] + ".mp4", true);
}
#region 視頻切換
// 下一個視頻
void NextVideo()
{
index++;
if (index > VideoNames.Length - 1)
index = 0;
//視頻播放
LoadVideo();
}
// 上一個視頻
void LastVideo()
{
index--;
if (index<0)
index = VideoNames.Length - 1;
//視頻播放
LoadVideo();
}
#endregion
#region 視頻播放、暫停、循環(huán)
// 播放與暫停開關(guān)點(diǎn)擊觸發(fā)
void DoPlayOrPause(bool s_isOn)
{
//如果播放,開始播放并文字顯示“播放”
if (s_isOn)
{
//通過持有的MediaPlayer類進(jìn)行操控
mediaPlayer.Control.Play();
//更改播放開關(guān)顯示的文字
m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "暫停";
}
//否則,暫停
else
{
mediaPlayer.Control.Pause();
//更改播放開關(guān)顯示的文字
m_videoToggle.transform.Find("VideoText").GetComponent<Text>().text = "播放";
}
}
// 是否循環(huán)播放開關(guān)點(diǎn)擊觸發(fā)
void DoSetLoop(bool s_isOn)
{
//通過持有的MediaPlayer類進(jìn)行操控
mediaPlayer.Control.SetLooping(s_isOn);
}
#endregion
#region 倍速
// 改變播放速度方法(正的加速放映,負(fù)的倒放映)
void DoChangeSpeed(int s_speed)//下拉列表對應(yīng)索引值
{
float tSpeed = 1;
switch (s_speed)
{
case 0:
tSpeed = 2;
break;
case 1:
tSpeed = 1.5f;
break;
case 2:
tSpeed = 1;
break;
case 3:
tSpeed = 0.5f;
break;
default :
Debug.Assert(false);
break;
}
mediaPlayer.Control.SetPlaybackRate(tSpeed);
}
#endregion
#region 進(jìn)度條
// 時刻更新視頻進(jìn)度到滑動條上
void DoUpdateVideoProcess()
{
//獲取當(dāng)前播放時長
float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
//獲取視頻總長度
float tVideoTime = mediaPlayer.Info.GetDurationMs();
//計(jì)算出對應(yīng)的播放進(jìn)度賦值給顯示播放進(jìn)度的進(jìn)度條
m_processSlider.value = tCurrentTime/tVideoTime;
}
// 更新播放進(jìn)度的時間顯示
void UpdateTimeText()
{
//對當(dāng)前播放時間轉(zhuǎn)換時間格式
//轉(zhuǎn)化為 秒
int tCurrentSeconds = (int)mediaPlayer.Control.GetCurrentTimeMs()/1000;
//獲取當(dāng)前分?jǐn)?shù)
int tCurrentMin = tCurrentSeconds/60;
//重新賦值剩余多少秒
tCurrentSeconds = tCurrentSeconds%60;
string tCurrentSecondStr = tCurrentSeconds < 10 ? "0" + tCurrentSeconds : tCurrentSeconds.ToString();
//對總時間轉(zhuǎn)化時間格式
//轉(zhuǎn)化為秒
int tVideoTimeSeconds = (int) mediaPlayer.Info.GetDurationMs()/1000;
//獲取總的分?jǐn)?shù)
int tVideoTimeMin = tVideoTimeSeconds/60;
//重新復(fù)制剩余多少秒
tVideoTimeSeconds = tVideoTimeSeconds%60;
string tVideoTimeSecondStr = tVideoTimeSeconds < 10 ? "0" + tVideoTimeSeconds : tVideoTimeSeconds.ToString();
//拼接一下時間顯示字符串
string tTime = string.Format("<color=black>{0}:{1}/{2}:{3}</color>", tCurrentMin, tCurrentSecondStr, tVideoTimeMin, tVideoTimeSecondStr);
m_videoTimeTex.text = tTime ;;
}
// 視頻播放進(jìn)度條值改變觸發(fā)
void OnProcessSliderChange(float value)
{
//獲取視頻總長度
float tVideoTime = mediaPlayer.Info.GetDurationMs();
//當(dāng)前視頻的時間
float tCurrentTime = m_processSlider.value*tVideoTime;
//將視頻時間調(diào)到對應(yīng)的節(jié)點(diǎn)
mediaPlayer.Control.Seek(tCurrentTime);
m_processSlider.transform.Find("Fill Area").Find("Fill").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
m_processSlider.transform.Find("Handle Slide Area").Find("Handle").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
}
// 播放進(jìn)度條開始拖動觸發(fā)(EventTrigger觸發(fā))
public void OnProcessSliderDragBegin()
{
//暫停播放
mediaPlayer.Control.Pause();
}
// 播放進(jìn)度條結(jié)束拖動觸發(fā)(EventTrigger觸發(fā))
public void OnProcessSliderDragEnd()
{
//開始播放
mediaPlayer.Control.Play();
}
// 返回到幾秒之前方法
void OnBackSecondsClick()
{
//獲取當(dāng)前播放進(jìn)度時間
float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
//10s前進(jìn)度時間(如果存在前十秒則退,不存在還是當(dāng)前時間進(jìn)度)
tCurrentTime = (tCurrentTime - m_backSeconds * 1000) >= 0 ? tCurrentTime - m_backSeconds*1000 : tCurrentTime;
//設(shè)置進(jìn)度時間
mediaPlayer.Control.Seek(tCurrentTime);
}
#endregion
#region 音量設(shè)置
// 音量進(jìn)度條改變觸發(fā)
void OnVolumeSliderChange(float value)
{
//保存當(dāng)前已經(jīng)設(shè)置的音量
if (value != 0)
{
m_customVolume = m_volumeSlider.value;
}
//設(shè)置音量
mediaPlayer.Control.SetVolume(value);
//如果音量手動調(diào)節(jié)到零,則將靜音模式打開
if (value > 0)
{
m_muteToggle.isOn = false;
}
else
{
m_muteToggle.isOn = true;
}
}
// 靜音開關(guān)觸發(fā)
void OnMuteToggleClick(bool s_isOn)
{
//如果靜音
if (s_isOn)
{
//設(shè)置靜音
m_volumeSlider.value = 0;
mediaPlayer.Control.SetVolume(0);
}
//不靜音
else
{
m_volumeSlider.value = m_customVolume;
mediaPlayer.Control.SetVolume(m_customVolume);
}
}
#endregion
}
其中視頻存放在streamingAssets文件夾中,視頻名稱存放在一個名為“name”的txt文件中,通過讀取name中視頻的名稱控制上一個,下一個視頻的播放。
四:程序包
鏈接:https://pan.baidu.com/s/1A3L3lMaJFHrK2lIGD13NWA?pwd=jl98 文章來源:http://www.zghlxwxcb.cn/news/detail-674617.html
提取碼:jl98文章來源地址http://www.zghlxwxcb.cn/news/detail-674617.html
到了這里,關(guān)于用unity插件AVProVideo制作一個視頻播放器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!