使用新的 Unity VideoPlayer 和 VideoClip API 播放视频 [英] Using new Unity VideoPlayer and VideoClip API to play video
问题描述
MovieTexture 在 Unity 5.6.0b1 之后终于被弃用现在发布了可在桌面和移动设备上播放视频的新 API.
MovieTexture is finally deprecated after Unity 5.6.0b1 release and new API that plays video on both Desktop and Mobile devices is now released.
VideoPlayer 和 VideoClip 可用于播放视频并根据需要检索每个帧的纹理.
VideoPlayer and VideoClip can be used to play video and retrieve texture for each frame if needed.
我已经设法让视频正常工作,但在 Windows 10 上的编辑器中却无法播放音频.有人知道为什么没有播放音频吗?
I've managed to get the video working but coduldn't get the audio to play as-well from the Editor on Windows 10. Anyone know why audio is not playing?
//Raw Image to Show Video Images [Assign from the Editor]
public RawImage image;
//Video To Play [Assign from the Editor]
public VideoClip videoToPlay;
private VideoPlayer videoPlayer;
private VideoSource videoSource;
//Audio
private AudioSource audioSource;
// Use this for initialization
void Start()
{
Application.runInBackground = true;
StartCoroutine(playVideo());
}
IEnumerator playVideo()
{
//Add VideoPlayer to the GameObject
videoPlayer = gameObject.AddComponent<VideoPlayer>();
//Add AudioSource
audioSource = gameObject.AddComponent<AudioSource>();
//Disable Play on Awake for both Video and Audio
videoPlayer.playOnAwake = false;
audioSource.playOnAwake = false;
//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;
//Set video To Play then prepare Audio to prevent Buffering
videoPlayer.clip = videoToPlay;
videoPlayer.Prepare();
//Wait until video is prepared
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
yield return null;
}
Debug.Log("Done Preparing Video");
//Set Audio Output to AudioSource
videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//Assign the Audio from Video to AudioSource to be played
videoPlayer.EnableAudioTrack(0, true);
videoPlayer.SetTargetAudioSource(0, audioSource);
//Assign the Texture from Video to RawImage to be displayed
image.texture = videoPlayer.texture;
//Play Video
videoPlayer.Play();
//Play Sound
audioSource.Play();
Debug.Log("Playing Video");
while (videoPlayer.isPlaying)
{
Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time));
yield return null;
}
Debug.Log("Done Playing Video");
}
推荐答案
发现问题.下面是播放视频和音频的 FIXED 代码:
Found the problem. Below is the FIXED code that plays Video and Audio:
//Raw Image to Show Video Images [Assign from the Editor]
public RawImage image;
//Video To Play [Assign from the Editor]
public VideoClip videoToPlay;
private VideoPlayer videoPlayer;
private VideoSource videoSource;
//Audio
private AudioSource audioSource;
// Use this for initialization
void Start()
{
Application.runInBackground = true;
StartCoroutine(playVideo());
}
IEnumerator playVideo()
{
//Add VideoPlayer to the GameObject
videoPlayer = gameObject.AddComponent<VideoPlayer>();
//Add AudioSource
audioSource = gameObject.AddComponent<AudioSource>();
//Disable Play on Awake for both Video and Audio
videoPlayer.playOnAwake = false;
audioSource.playOnAwake = false;
//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;
//Set Audio Output to AudioSource
videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//Assign the Audio from Video to AudioSource to be played
videoPlayer.EnableAudioTrack(0, true);
videoPlayer.SetTargetAudioSource(0, audioSource);
//Set video To Play then prepare Audio to prevent Buffering
videoPlayer.clip = videoToPlay;
videoPlayer.Prepare();
//Wait until video is prepared
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
yield return null;
}
Debug.Log("Done Preparing Video");
//Assign the Texture from Video to RawImage to be displayed
image.texture = videoPlayer.texture;
//Play Video
videoPlayer.Play();
//Play Sound
audioSource.Play();
Debug.Log("Playing Video");
while (videoPlayer.isPlaying)
{
Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time));
yield return null;
}
Debug.Log("Done Playing Video");
}
为什么没有播放音频:
//Set Audio Output to AudioSource
videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;
//Assign the Audio from Video to AudioSource to be played
videoPlayer.EnableAudioTrack(0, true);
videoPlayer.SetTargetAudioSource(0, audioSource);
必须在 videoPlayer.Prepare();
之前调用,而不是在它之后调用.这花了数小时的实验才发现这是我遇到的问题.
must be called before videoPlayer.Prepare();
not after it. This is took hours of experiment to find this this was the problem I was having.
卡在准备视频"上?
在 videoPlayer.Prepare();
调用后等待 5 秒然后退出 while 循环.
Wait 5 seconds after videoPlayer.Prepare();
is called then exit the while loop.
替换:
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
yield return null;
}
与:
//Wait until video is prepared
WaitForSeconds waitTime = new WaitForSeconds(5);
while (!videoPlayer.isPrepared)
{
Debug.Log("Preparing Video");
//Prepare/Wait for 5 sceonds only
yield return waitTime;
//Break out of the while loop after 5 seconds wait
break;
}
这应该可行,但您可能会在视频开始播放时遇到缓冲.在使用此临时修复程序时,我的建议是提交标题为videoPlayer.isPrepared always true"的错误,因为这是一个错误.
This should work but you may experience buffering when the video starts playing. While using this temporary fix, my suggestion is to file for bug with the title of "videoPlayer.isPrepared always true" because this is a bug.
一些人们也通过改变来修复它:
Some people also fixed it by changing:
videoPlayer.playOnAwake = false;
audioSource.playOnAwake = false;
到
videoPlayer.playOnAwake = true;
audioSource.playOnAwake = true;
<小时>
从 URL 播放视频:
替换:
//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;
与:
//We want to play from url
videoPlayer.source = VideoSource.Url;
videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";
然后删除:
public VideoClip videoToPlay;
和 videoPlayer.clip = videoToPlay;
因为不再需要这些.
public VideoClip videoToPlay;
and videoPlayer.clip = videoToPlay;
as these are not needed anymore.
播放来自 StreamingAssets 文件夹的视频:
string url = "file://" + Application.streamingAssetsPath + "/" + "VideoName.mp4";
if !UNITY_EDITOR && UNITY_ANDROID
url = Application.streamingAssetsPath + "/" + "VideoName.mp4";
#endif
//We want to play from url
videoPlayer.source = VideoSource.Url;
videoPlayer.url = url;
<小时>
所有支持的视频格式:
- ogv
- vp8
- webm
- 移动
- dv
- mp4
- m4v
- mpg
- mpeg
Windows 上额外支持的视频格式:
- avi
- asf
- wmf
其中一些格式在某些平台上不起作用.请参阅这篇帖子有关支持的视频格式的更多信息.
Some of these formats don't work on some platforms. See this post for more information on supported video formats.
这篇关于使用新的 Unity VideoPlayer 和 VideoClip API 播放视频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!