C# 检测视频播放器何时完成播放

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

我有一个MovieController类来管理我项目中的视频。我正在使用Unity 5.6中引入的新视频播放器组件

我想在电影播放完毕后调用一个方法。到目前为止,此方法只是一个
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();
}