c# - 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);
}
}
没有错误信息。
解决方案
现代视频压缩(以 H264 为最著名的示例)基于仅对当前帧与前一帧之间的差异进行编码。可以将解码器(在本机 c++ 端)想象为一个黑盒,它提供二进制编码流并一一分割帧。进入随机帧的过程包括首先寻找最后一个“完全编码的帧”,将其描绘为不时添加的 JPG 以保持一致性。比解码器需要解码中间的每一帧,以便为您提供您请求的实际帧 - 最后一个完全编码的帧可能在过去几秒钟后,在您可以寻找您实际的帧之前要解码的帧数量want 可以在数百个范围内,解码器无法立即跳转到您的代码请求的给定帧。
如果有 5 帧,它几乎可以跟上 - 实际上还不错。
如果你想做更有趣的事情(比如乒乓球),你可以订阅 VideoPlayer.frameReady 事件,这是交换 RenderTextures 并缓冲它们的好时机 - 你几乎可以立即访问视频内存中的 RenderTextures。您会很快消耗内存,但是对于 156 帧(如问题中所述),在合理的分辨率下,它将比从播放器请求每一帧快几个数量级
推荐阅读
- swift - 我们如何在 SwiftUI 中将图像按钮放在圆形图像的角下方?
- java - 如何使用注释在 Spring Boot 应用程序中的同一类中注入不同类型的相同通用接口的两个实例
- java - 将查询结果映射到 dto
- objective-c - Objective-C,Typhoon,将程序集作为参数传递
- mongodb - ERR_CONNECTION_TIMED_OUT - mongodb
- reactjs - 在某些情况下,如何防止 react-persist 将数据存储到本地存储?
- python - 如何将实时坐标从位置文件发送到python中的不同文件?
- java - 为什么它是初始化新实例化(非持久)实例的集合值属性的最佳方式?
- function - 如何将对象作为参数传递给 MATLAB 中的匿名函数?
- python - 无法使用 whl 文件安装 htm5lib