代码之家  ›  专栏  ›  技术社区  ›  markt1964

Unity3D中的MovieTexture从未准备好播放

  •  1
  • markt1964  · 技术社区  · 12 年前

    我正在使用一个Unity WWW对象加载一个ogg理论格式的电影文件,但我遇到了一些奇怪的问题,我一直无法解决。

    为了澄清,我在Assets文件夹中有一个名为“Movies/”的文件夹,其中包含我所有本地存储的电影文件。

    下面是我的应用程序的C#代码片段,它位于使用StartCoroutine运行的类方法内部:

    WWW www = new WWW("file://" + Application.dataPath + "/Movies/" + movieName + ".ogg");
    yield return www;
    m_MovieTexture = www.movie;
    if (m_MovieTexture == null)
    {
        DbgLog("Movie is NULL!");
        return;
    }
    if (m_MovieTexture.isPlaying)
    {
        // Not sure how this can happen, but just in case....
        m_MovieTexture.Stop();
    }
    else
    {
        if (www.error != null)
        {
            DbgLog("Error: " + www.error);
            return;
        }
        DbgLog("Waiting to load " + www.url);
        while (!m_MovieTexture.isReadyToPlay && !www.isDone)
        {
            yield return www;
        }
        DbgLog("Finished Loading");
        if (www.isDone && !m_MovieTexture.isReadyToPlay)
        {
            DbgLog("Weirdness!  File finished loading before movie was ready to play!");
        }
    }
    m_MovieTexture.Play();
    DbgLog("Playing video (" + m_MovieTexture.duration + " seconds)");
    while (m_MovieTexture.isPlaying)
        yield return null;
    // be kind... rewind.
    m_MovieTexture.Stop();
    DbgLog("Finished Playing");
    m_MovieTexture = null;
    

    当执行上述代码时,其中的日志语句显示,即使m_MovieTexture.isReadyToPlay返回false,www.isDone属性也会返回true。最初,while循环只等待m_MovieTexture.isReadyToPlay,但该循环无休止地等待,因此添加了额外的条件,这暴露了实际发生的事情。电影的持续时间也总是-1,最后,尽管显式调用m_MovieTexture.play()并在m_MovieTexture.isPlaying为true时循环,但上述代码似乎根本没有等待视频播放,m_MovieTexture.isPlayning立即返回false,并且电影从不播放(OnGUI方法中有代码,如果有,则显示m_MovieTexture的内容,并且电影正在播放,但问题似乎在于上述代码,而不是OnGUI方法)。

    如果能想到我在这里可能做错了什么,我们将不胜感激。

    提前谢谢

    1 回复  |  直到 12 年前
        1
  •  1
  •   Jerome Maurey-Delaunay    12 年前

    WWW已经是一个非阻塞的协同例程。因此,您可以使用一个函数来指示WWW实例加载视频,并将电影分配给m_MovieTexture。然后在您的OnGUI或更新功能中检查

    if(m_MovieTexture!=null && !m.isPlaying && m.isReadyToPlay) m_MovieTexture.play();
    

    这是链接 MovieTexture.onIsReadyToplay 文件。