检测VideoPlayer何时播放完成

3
我有一个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();
    }
}

我的问题是,在视频结束时没有调用OnMovieFinished,我最后只得到一个黑屏和控制台中没有任何内容。
4个回答

5
我不信任或使用VideoPlayer API的事件,因为我也遇到了问题。你看到的是一个已经存在了几个月还未被修复的bug。
如果你想检测视频是否播放完成,请使用协程,在while循环中每帧检查videoPlayer.isPlaying。当while循环结束时,表示视频已经播放完成。
while (videoPlayer.isPlaying)
{
    yield return null;
}

//Done Playing

我现在无法测试暂停功能是否影响videoPlayer.isPlaying,但你可以自己测试一下。


另一种方法是检查frame是否与frameCount相同。当这个条件成立时,你就知道视频已经播放完了。

if(videoPlayer.frame == videoPlayer.frameCount)
{
    //Video has finshed playing!
}

如果以上方法都无法解决您的问题,那么请提交错误报告。

videoPlayer.isPlaying 也不起作用,但是使用 videoPlayer.frame 的第二种方法有效。 - user5455540
这就是为什么我提供了两种方法来解决它,以便如果一种失败,另一种就会起作用。我认为你应该提交一个错误报告,因为你的原始代码实际上应该可以工作。在我的Unity 5.6版本中,它现在似乎正在工作。 - Programmer
1
framecount方法对我很有效。但是videoplayer无法达到framecount,所以最终只能与framecount-1进行比较。 - darshanz

0

0
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();
}

0
有趣的是,在Unity 2018.4.25(我正在使用的当前版本)中,这仍然不能完全按预期工作。在启动时播放视频通常会导致isPlaying为false(跳出视频而不播放它,同时进行测试)。
(videoPlayer.frame == videoPlayer.frameCount)

在移动设备(Android)上似乎无法可靠地工作,因为视频将在播放所有帧之前停止播放(isPlaying == false),通常会跳过几个短帧(我认为这是帧跳过)。

我发现

if (( videoPlayer.frame) > 0 && (videoPlayer.isPlaying == false))

这捕捉了我在移动设备上遇到的用例问题,但可能还有更有趣的用例和组合需要处理。我将上面的测试放入了一个update()而不是协程中。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接