Unity VideoPlayer设置框架在Windows上不起作用

时间:2019-06-14 20:05:27

标签: c# unity3d

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

所提供的脚本可以在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);
    }
}

没有错误消息。

1 个答案:

答案 0 :(得分:0)

现代视频压缩(最著名的例子是H264)基于对当前帧和前一帧之间的差异进行编码。可以将解码器(在本机c ++方面)想象为一个黑匣子,该黑匣子被提供以二进制编码的流并将帧一一拆分。转到随机帧的过程包括首先寻求最后一个“完全编码的帧”,将其图片化为JPG,偶尔添加一次以保持一致性。解码器需要解码其间的每个帧才能为您提供您所请求的实际帧-最后一个完全编码的帧可能要过去几秒钟,要解码的帧数才可以找到您实际需要的帧。想要在数百个范围内,解码器将无法立即跳转到您的代码所请求的给定帧。

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

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