gpt4 book ai didi

ios - 当已经有新帧时如何跳过 didReceiveFrame ?

转载 作者:行者123 更新时间:2023-12-03 19:49:57 24 4
gpt4 key购买 nike

在 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
}
}

1.0f/24.0f 部分决定最大 fps。在这种情况下,它每秒渲染的帧数不会超过 24 帧,这对于视频流来说相当不错,而且低得足以注意到性能的提高。如果在 1/24 秒过去之前调用 renderFrame 方法,则它不会执行任何操作。

注意:这样做意味着渲染不会稳定在 24fps,因为它不会跳过每个 x 帧,而是依赖于调用 render 方法的时间,如果调用的帧过多,则简单地丢弃一帧上一个之后不久。我在我的应用程序中没有注意到这一点,但需要记住这一点,尤其是在使用较低的最大 fps 时。

关于ios - 当已经有新帧时如何跳过 didReceiveFrame ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27423847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com