C# 检测视频播放器何时完成播放
我有一个MovieController类来管理我项目中的视频。我正在使用Unity 5.6中引入的新视频播放器组件 我想在电影播放完毕后调用一个方法。到目前为止,此方法只是一个C# 检测视频播放器何时完成播放,c#,events,unity3d,unity5,C#,Events,Unity3d,Unity5,我有一个MovieController类来管理我项目中的视频。我正在使用Unity 5.6中引入的新视频播放器组件 我想在电影播放完毕后调用一个方法。到目前为止,此方法只是一个Debug.Log,如您所见: using UnityEngine; using UnityEngine.Video; public class MovieController : MonoBehaviour { private VideoPlayer m_VideoPlayer; void Awake
Debug.Log
,如您所见:
using UnityEngine;
using UnityEngine.Video;
public class MovieController : MonoBehaviour
{
private VideoPlayer m_VideoPlayer;
void Awake ()
{
m_VideoPlayer = GetComponent<VideoPlayer>();
m_VideoPlayer.loopPointReached += OnMovieFinished; // loopPointReached is the event for the end of the video
}
void OnMovieFinished(VideoPlayer player)
{
Debug.Log("Event for movie end called");
player.Stop();
}
}
使用UnityEngine;
使用UnityEngine.Video;
公共级电影制作人:MonoBehavior
{
私人视频播放器;
无效唤醒()
{
m_VideoPlayer=GetComponent();
m\u VideoPlayer.LoopPointReach+=OnMovieFinished;//LoopPointReach是视频结束的事件
}
void OnMovieFinished(视频播放器)
{
Log(“调用电影结尾的事件”);
player.Stop();
}
}
我的问题是,在视频结束时没有调用OnMovieFinished
,我的结果是黑屏,控制台中没有任何内容。我不信任或使用视频播放器
API中的事件,因为我也遇到了问题。你看到的是一个已经好几个月没有修复的bug
如果要检测视频是否已播放完毕,请使用协同程序检查
videoPlayer.isPlaying
while循环中的每一帧。当while循环存在时,表示视频已完成播放
while (videoPlayer.isPlaying)
{
yield return null;
}
//Done Playing
我现在无法测试暂停功能是否会影响视频播放器。iPlaying,但您可以自己测试
另一种方法是检查是否与相同。如果这是真的,您就知道视频已经播放完毕
if(videoPlayer.frame == videoPlayer.frameCount)
{
//Video has finshed playing!
}
如果这些都不能解决您的问题,请提交一份bug报告。有趣的是,这仍然没有完全按照Unity 2018.4.25(我正在使用的当前版本)中的预期工作。在启动时播放视频通常会导致isPlaying错误(在没有播放视频的情况下跳出视频,同时测试
(videoPlayer.frame == videoPlayer.frameCount)
在移动设备(android)上似乎无法可靠地工作,因为视频在播放完所有帧(通常短几帧,我认为是帧跳过)之前会停止播放(isplay==false)
我发现
if (( videoPlayer.frame) > 0 && (videoPlayer.isPlaying == false))
捕获了我在移动设备上遇到的用例问题,但是可能还有更有趣的用例和组合需要处理。我将上面的测试放在了update()中,而不是一个共同例程中
HTH.使用UnityEngine.Video;
私人视频播放器;
私人浮动开始;
无效唤醒()
{
vid=GetComponent();
开始=时间。时间;
视频播放();
start例程(waitmethod());
}
IEnumerator waitmethod()
{
while(Time.Time-开始<视频长度)
{
收益返回空;
}
运行YourNext();
}
videoPlayer.isplay
也不起作用,但是使用videoPlayer.frame
的第二种方法起作用了。这就是为什么我提供了两种方法,如果其中一种失败,另一种也能起作用。我想你应该提交一份错误报告,因为你的原始代码实际上应该起作用。它现在似乎在我的Unity 5.6中起作用了version.framecount方法对我来说效果很好。但videoplayer并没有达到framecount,所以最终与framcount-1进行了比较。
using UnityEngine.Video;
private VideoPlayer vid;
private float beginning;
void Awake()
{
vid = GetComponent<VideoPlayer>();
beginning = Time.time;
vid.Play();
StartCoroutine(waitmethod());
}
IEnumerator waitmethod()
{
while (Time.time - beginning < vid.length)
{
yield return null;
}
runyournext();
}