Unity3D VideoPlayer播放视频和音频
今天来记录一下用Unity自带的VideoPlayer播放视频和音频。
首先准备一个带音频的视频文件,导入到工程中。Windows支持的视频格式有:.mp4,.mov,.mpg,.mpeg,.asf,.avi,.dv,.mv4,.ogv,.vp8,.webm,.wmv等。
视频的转码根据自己需求选择,如果不转码,视频文件将按原样使用,可以节省时间,避免相关的质量损失,但需自己验证该视频与目标平台的是否兼容。
新建一个Canvas,在Canvas下新建一个RawImage控件,设置好Rawimage的大小,好与视频的尺寸匹配。点击RawImage下的Add Component,添加VideoPlayer组件和Audio Source组件。在Project工程中,单击右键——> create ——> Render Texture,命名为Video_texture,根据视频尺寸,设置好Video_texture的尺寸(最好与RawImage的尺寸一致)。
把Video_texture分别拖进RawImage和VideoPlayer的相应位置 。把视频拖入VideoPlayer的Video Clip栏(这里Source选用Video Clip,如果选用UR,则需把该视频的路径填入即可)。接着把Audio Souce拖入VideoPlayer的Audio Souce中。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
public class VideoPlay : MonoBehaviour {
public VideoPlayer videoPlayer;
private AudioSource audioSource;
public Transform Buttons;
private RawImage rawImage;
void Start()
{
rawImage = videoPlayer.gameObject.GetComponent<RawImage>();
audioSource = videoPlayer.GetComponent<AudioSource>();
StartCoroutine(PlayVideo());
foreach(Transform t in Buttons)
{
t.GetComponent<Button>().onClick.AddListener(delegate { PlayEvent(t.name); });
}
}
void Update()
{
//键盘向上箭头加音量
if (Input.GetKeyDown(KeyCode.UpArrow))
{
if (audioSource.volume < 1)
audioSource.volume += 0.1f;
}
//键盘向下箭头减音量
else if (Input.GetKeyDown(KeyCode.DownArrow))
{
if (audioSource.volume > 0)
audioSource.volume -= 0.1f;
}
//按ESC退出软件
if (Input.GetKeyDown(KeyCode.Escape))
Application.Quit();
}
IEnumerator PlayVideo()
{
//当唤醒该对象时,视频不会自动播放
videoPlayer.playOnAwake = false;
//false,不循环播放
videoPlayer.isLooping = false;
//视频每次到达结尾值,调用委托(监听视频播放完成)
//videoPlayer.loopPointReached += ReachedLoop;
//播放引擎准备(提高开始播放时的速度)
videoPlayer.Prepare();
//当再次显示播放时,将上次视频的最后一帧销毁
videoPlayer.targetTexture.Release();
yield return null;
}
public void PlayEvent(string name)
{
switch (name)
{
case "play":
//获得视频的音频
videoPlayer.SetTargetAudioSource(0, this.GetComponent<AudioSource>());
//播放视频
videoPlayer.Play();
break;
case "pause":
videoPlayer.Pause();
break;
case "stop":
videoPlayer.Stop();
break;
case "rePlay":
videoPlayer.frame = 0;
videoPlayer.Play();
break;
}
}
}
把代码挂在Canvas上,拖入RawImage跟Buttons,运行即可
动图如下: