在 webrtc 应用程序中,有一个名为 didReceiveFrame 的回调,当有新帧要渲染时会调用该回调。它将新帧作为参数传递,并且可以从该帧中提取纹理。但是,如果由于某种原因主线程被延迟(例如断点、设备旋转、仍然忙于渲染等),那么将为每个“错过”的帧单独调用此回调。这实际上增加了相机捕获的内容和渲染的内容之间的延迟。
如何确保仅使用最新帧调用 didReceiveFrame?或者我如何查看传递的帧是否是最新的(这样我可以跳过该功能)?
我从来没有找到一种方法来用库来做到这一点,但我使用一个实现了我自己的简单检查NSDate
。我在渲染器类中存储一个属性,如下所示:
@property (strong, nonatomic) NSDate* timeOfLastFrame;
我在我的中初始化它viewDidLoad
像这样:
self.timeOfLastFrame = [[NSDate alloc] initWithTimeIntervalSince1970:0.0];
我在渲染方法中使用它,如下所示:
- (void)renderFrame:(RTCI420Frame*)frame {
if ([[NSDate date] timeIntervalSinceDate:self.timeOfLastFrame] > 1.0f/24.0f) { // or whatever fps you want
self.timeOfLastFrame = [NSDate date];
// do rendering
}
}
The 1.0f/24.0f
部分决定最大 fps。在这种情况下,它每秒渲染的帧数不会超过 24 帧,这对于视频流来说相当不错,而且低得足以注意到性能的提高。如果renderFrame
方法在 1/24 秒过去之前被调用,它根本不执行任何操作。
注意:这样做意味着渲染不会稳定在 24fps,因为它不会跳过每个 x 帧,而是依赖于调用 render 方法的时间,如果在前一个。我在我的应用程序中没有注意到这一点,但需要记住这一点,特别是在使用较低的最大 fps 时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)