首页 > 解决方案 > Unity VideoPlayer 设置框架在 Windows 上不起作用

问题描述

我想创建一个非常简单的视频控制器来设置视频的帧。我创建了一个值滑块来在视频的时间线上向前和向后滚动。

提供的脚本在 Mac 上完美运行,但在 Windows 上却有着令人难以置信的延迟。

有时它会注册设置的值并在视频上跳转到它,有时它不会......它是自满的随机。(windows电脑也有更好的硬件)

任何关于 Windows 上可能出现的问题的建议将不胜感激,因为我必须在 Windows 计算机上运行它。

视频为 H264 格式,没有音频。

我尝试用 PingPong 更改值

setFrame = Mathf.RoundToInt(Mathf.PingPong(Time.time*frameCount, 156));

如果 frameCount 小于 5,它可以工作。

我在用UnityEngine.Video;

[Range(1,156)]
public int setFrame=1;
public int frameCount;

void Start()
{
    Debug.Log("SetTime" + video.canSetTime);
    Debug.Log("SetSkip" + video.canSetSkipOnDrop);
    Debug.Log("TimeRef" + video.timeReference);

    frameCount = video.frameCount;
}

void Update()
{
    if (video.frame >= 0)
    {
        video.Pause();
        video.frame = setFrame;
        //Debug.Log(video.frame);
    }
}

没有错误信息。

标签: c#unity3d

解决方案


现代视频压缩(以 H264 为最著名的示例)基于仅对当前帧与前一帧之间的差异进行编码。可以将解码器(在本机 c++ 端)想象为一个黑盒,它提供二进制编码流并一一分割帧。进入随机帧的过程包括首先寻找最后一个“完全编码的帧”,将其描绘为不时添加的 JPG 以保持一致性。比解码器需要解码中间的每一帧,以便为您提供您请求的实际帧 - 最后一个完全编码的帧可能在过去几秒钟后,在您可以寻找您实际的帧之前要解码的帧数量want 可以在数百个范围内,解码器无法立即跳转到您的代码请求的给定帧。

如果有 5 帧,它几乎可以跟上 - 实际上还不错。

如果你想做更有趣的事情(比如乒乓球),你可以订阅 VideoPlayer.frameReady 事件,这是交换 RenderTextures 并缓冲它们的好时机 - 你几乎可以立即访问视频内存中的 RenderTextures。您会很快消耗内存,但是对于 156 帧(如问题中所述),在合理的分辨率下,它将比从播放器请求每一帧快几个数量级


推荐阅读