我想创建一个非常简单的视频控制器来设置视频帧。我创建了一个值滑块,可以在视频的时间轴上向前和向后滚动。
所提供的脚本可以在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);
}
}
没有错误消息。
答案 0 :(得分:0)
现代视频压缩(最著名的例子是H264)基于对当前帧和前一帧之间的差异进行编码。可以将解码器(在本机c ++方面)想象为一个黑匣子,该黑匣子被提供以二进制编码的流并将帧一一拆分。转到随机帧的过程包括首先寻求最后一个“完全编码的帧”,将其图片化为JPG,偶尔添加一次以保持一致性。解码器需要解码其间的每个帧才能为您提供您所请求的实际帧-最后一个完全编码的帧可能要过去几秒钟,要解码的帧数才可以找到您实际需要的帧。想要在数百个范围内,解码器将无法立即跳转到您的代码所请求的给定帧。
如果有5帧,它几乎可以跟上-实际上还不错。
如果您想做一些时髦的事情(例如乒乓球),您可以订阅VideoPlayer.frameReady事件,这是交换RenderTextures并缓冲它们的好时机-您几乎可以立即访问视频内存中的RenderTextures。您可以相当快地消耗内存,但是对于156帧(如问题所述),以合理的分辨率,它比向播放器请求每一帧要快几个数量级