当已经有一个新的框架时如何跳过didReceiveFrame?

在一个webrtc应用程序中有一个名为didReceiveFrame的callback函数,当有一个新的框架被渲染时被调用。 它通过新的框架作为参数,可以从这个框架中提取纹理。 但是,如果由于某种原因,主线程被延迟(考虑断点,设备旋转,仍然繁忙的渲染,等等),然后这个callback被分别调用每个“错过”的框架。 这有效地增加了摄像头捕获和渲染之间的延迟。

我怎样才能确保didReceiveFrame只调用最新的帧? 或者我怎么能看到如果传递的帧是最新的(所以我可以跳过function)?

我从来没有find一种方法来做到这一点,但我使用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帧,这对于videostream来说是相当不错的,而且足够低以致于性能提升。 如果renderFrame方法在1秒24秒之前被调用,它根本就不会做任何事情。

注意:这样做意味着渲染将不会稳定在24fps,因为它不会跳过每x帧,而是依赖于何时渲染方法被调用,并且如果它在前一个。 我没有注意到它在我的应用程序,但要记住,尤其是当使用低最大帧数。