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

2023-12-26

在 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(使用前将#替换为@)

当已经有新帧时如何跳过 didReceiveFrame ? 的相关文章

  • GoogleMobileAds iOS 9 链接错误

    我按照以下步骤操作this https firebase google com docs admob ios quick start 由于我在安装 cocoapods 时遇到问题 我手动下载了 SDK zip 将其添加到项目中 它编译得很好
  • 无法使用 MFMailComposeViewController 从应用程序发送电子邮件

    我在尝试从我的应用程序发送电子邮件时遇到了一些困难 我尝试了 iCodeBlog 中的这段代码 http icodeblog com 2009 11 18 iphone coding tutorial in application emai
  • MFMailComposeViewController 立即关闭

    情况是 MFMailComposeViewController 将被呈现 我看到它已经完成了一半 但后来就被驳回了 这是错误 serviceViewControllerReady 错误 错误域 UIViewServiceInterfaceE
  • 在 Swift 2.0 中以横向模式使用 UIImagePickerController

    我正在编写一个仅限 LandScape 的 iPad 应用程序 我需要从库中拍照以发送数据库 但图像上传屏幕仅适用于纵向模式 如何将其更改为横向模式 我读过一些关于 UIPickerControllerDelegate 不支持横向模式的内容
  • 当我关闭应用程序时,我收到来自调试器的消息:由于信号 15 而终止

    我该如何解决这个问题 我不知道它是否影响了我在此链接中的问题我之前关于核心数据的问题 https stackoverflow com questions 30012086 swift core data does not store the
  • 检测 UIWebView 中的 Zoomscale

    我的问题是我想检测 UIWebView 的缩放比例 我尝试搜索它但没有得出正确的答案 感谢任何帮助 好吧 虽然UIWebView没有zoomScale财产 UIScrollView做 所以我们只需扫描它subView s为了scrollVi
  • 以点值检测 iPhone 6/6+ 屏幕尺寸

    鉴于新发布的 iPhone 6屏幕尺寸 http www apple com iphone compare iPhone 6 1334h 750w 2x in points 667h 375w iPhone 6 1920 1080 3x i
  • 自定义选项卡栏上的“更多”菜单

    我在我的应用程序上使用选项卡栏 UITabBarController 我希望自定义单击 更多 按钮时出现的表格的外观 我已经研究出如何通过设置来更改更多屏幕上导航栏的外观 self moreNavigationController navi
  • Objective-C 内存管理:发布时崩溃

    我是 Objective C 的新手 似乎无法正确理解内存管理代码 我有以下代码 Media myMedia self myMediaManager getNextMedia self navigationItem title self m
  • 当我使用prepareForSegue将值传递给目标控制器时,存在一些问题

    首先 我使用storyboard创建两个uiviewcontroller 第一视图控制器 and 第二个视图控制器 并使用 xcode 嵌入导航控制器 into 第二个视图控制器 编辑器 gt 嵌入 gt 导航控制器 然后 我还想使用 se
  • swift 中 pch 的替代品是什么?

    我想知道可以用什么来代替 swift 中的 pch 有没有 pch 的替代方案或方法可以快速摆脱导入 这样我们就不需要对所有类都这样做 我不想一直随身携带 进口 swift 中 pch 的最佳替代品是什么 您无法在 swift 中定义 宏
  • 预填充 UICollectionView 单元重用队列

    问题 我有一个应用程序 只有一个UICollectionView我第一次滚动它时很卡顿 我已将来源范围缩小到正在创建新单元格 2 的事实 使用initWithFrame 因为周围没有可以重复使用的细胞 初始滚动后 重用队列不为空 单元格可以
  • Gmail 中删除了 iOS 深层链接

    我正在尝试发送一封带有深层链接的电子邮件到我的 iOS 应用程序 使用 myapp 格式从电子邮件中将其打开 它可以在任何 iOS 邮件客户端 邮件 邮箱等 中运行 即点击它打开应用程序 但不能在 Gmail 应用程序 甚至网络 中运行 因
  • 在后台线程上搜索

    我试图在 iPhone 应用程序中搜索数千个对象 但是搜索严重滞后 每次击键后 UI 都会冻结 1 2 秒 为了防止这种情况 我必须在后台线程上执行搜索 我想知道是否有人有一些在后台线程上搜索的提示 我读了一点NSOperation并在网上
  • Xcode 8:使用 iOS 9.3 基础 SDK 编译?

    我在 Xcode 8 0 beta 8S128d 中将 iOS 应用程序升级到 Swift 3 0 我以为一切都已准备就绪 并将其上传到 iTunes Connect 当我点击 提交审核 时 它给了我一个包含 26 个错误的列表 每个嵌入式
  • UITableView 在单元格刷新时滚动到顶部

    我有一个 UITableView 其中一个单元格的大小是动态调整的 以适应其中的 UITextView 每当键入一个键时 单元格都会检查计算出的高度是否增加 就像换行符一样 因此它可以告诉表单元格的高度需要重新计算 我用这段代码做到了这一点
  • 如何在 iPhone 中查找本周的最后一天?

    在我的应用程序中 我使用以下代码来检索当前日期和星期 NSDate today1 NSDate date NSDateFormatter dateFormat NSDateFormatter alloc init dateFormat se
  • searchDisplayController 在 iOS 8 中已弃用

    如何更正以下内容以免出现警告 我缺少什么 修正时searchResultsController to searchController它给了我一个错误 找不到对象 if tableView self searchDisplayControl
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • Flipboard 动画

    有谁知道如何构建像 Flipboard 应用程序一样的翻转动画 谢谢 如果你指的是翻页过渡 请查看我编写的 OpenGL 过渡类 https github com epatel EPGLTransitionView https github

随机推荐

  • Angular 6 - 如何在组件级别应用外部 CSS 样式表(传单)?

    尝试在 Angular 6 组件中使用 Leaflet 根据 css 文件的链接方式 地图显示正常或混乱 缺少的图块顺序不正确 这意味着未考虑 css 我设法让它与 2 个解决方案一起使用 将 css 链接到应用程序级别 全局 但不仅仅链接
  • 您可以在动态计时器上触发 AWS Lambda 吗?

    有没有办法在动态计时器上触发 AWS Lambda 目前 我正在利用预定事件来触发 lambda 但这是一个设定的计时器 有没有办法动态设置从 Lambda 内部触发 Lambda 的时间 这里的想法是 这个 Lambda 执行特定的检查并
  • Rails、yml 和多行

    我一生都无法从我的语言环境文件中获取多行 yaml 来工作 我尝试了多种解决方案的每种组合 但没有成功 我努力了key key gt 双引号 单引号 n 下一行的值 缩进 可能还有其他一些 在我看来我只是使用t key 我在这里撕扯我的头发
  • 将分面 ggplots (facet_wrap) 与 R 中的owplot 对齐

    我正在尝试对齐两个面板图 它们是用facet wrap in ggplot按照以下方式 注意 面板 A 需要保持为空 然而 我注意到面板 B 的 y 轴与面板 C 的最后一个图的 y 轴并不完全对齐 尽管选项axis lb 在两个方面 Co
  • 按日期对 HashMap 进行排序

    在 Java 类中 我有一个按日期重新排序现有 HashMap 的方法 HashMap 是一种类型
  • 在 CodeIgniter 上集成 Bootstrap

    我正在尝试在 codeigniter 网站上使用 bootstrap 但似乎找不到 bootstrap 文件
  • 带参数的路由不起作用

    我正在关注tutorial https openui5 hana ondemand com docs guide 2366345a94f64ec1a80f9d9ce50a59ef html在这里 我陷入了带参数的路由 该示例应用程序未在我的
  • C++ 元函数来确定类型是否可调用

    是否可以编写一个 C 0x 元函数来确定类型是否可调用 我所说的可调用类型是指函数类型 函数指针类型 函数引用类型 这些由boost function types is callable builtin lambda 类型以及任何具有重载的
  • 为什么 Rubocop 不允许 html_safe 或 raw() Rails

    这是我没有通过 Rubocop 的代码 因为 Rails OutputSafety 将字符串标记为 html 安全可能存在安全风险 def number with html delimiter num number with delimit
  • 运行“yarn run”时将参数传递给“node”可执行文件

    节点可以使用各种选项启动 特别有趣的是 inspect flag node inspect node modules bin jest some spec js 是否可以通过 inspect以某种方式标记yarn run 例如 yarn r
  • 使用 Windows 身份验证的 WCF jsonP - 可能吗?

    我正在托管一个输出 jsonp 的 wcf 服务 来自 IIS 打开 Windows 身份验证 的响应是 经过身份验证的服务不支持跨域 javascript 回调 有办法解决这个问题吗 我必须打开 Windows 身份验证 但也想使用 wc
  • SpriteKit 内存泄漏更改包含 SKTileMapNodes 的场景

    我正在尝试使用 Swift SpriteKit 和 SKTileMaps 创建一个简单的 2d 平台游戏 但每次我在包含 SKTileMaps 的场景之间切换时 我都会在 Xcode Instruments 中看到大量内存泄漏 我已经尽可能
  • 将字符串转换为负数

    我需要从字符串类型转换为数字 list 5 4 3 variable Input list 5 4 3 variable epected output 我在转换负数时遇到问题 list 0 int list 0 ValueError 以 1
  • 将 Parse.com 密码迁移到 Django

    我正在尝试将数据从 Parse com 迁移到我们自己的服务器 为此 用户密码也必须迁移 Parse com 使用标准 bcrypt 密码加密 密码按以下格式显示 如何将密码从 Parse 移至另一台服务器 https www parse
  • 当鼠标放置在包含的 div 元素上时更改锚文本的颜色

    当我将鼠标移到文本上时 文本颜色会发生变化 a 链接 但当我将其放在 div 包含它的 当鼠标放在包含的 div 上时 我也想更改锚文本的颜色 more games background color F1F1F1 margin left 1
  • Jackson Yaml 类型信息在序列化时错误

    通过 Jackson 将对象序列化为 yml 时 我得到以下输出 commands dev
  • 如何解决转发的 WinAPI 的循环依赖?

    我试图找到一种方法来解析映射到进程中的特定 API 的内存地址和 DLL 文件名 大多数问题可以通过 DLL 中的导入 导出表以及分析映射模块的导入地址表来解决 这适用于大多数功能 但这个问题发生在一些人身上转发功能 https blogs
  • 将 Asp.Net Core 3.1 应用程序升级到 .Net 5 后,某些 C# 9 功能不可用

    我通过将相应的 csproj 文件修改为以下内容 将 Asp Net Core 3 1 MVC 升级到 Net 5
  • 添加弹出窗口到闪亮的应用程序?

    我想在小部件的标题旁边添加一个 以便用户可以将鼠标悬停或单击它并获取额外的信息和他们可以单击的链接 这就是我现在所拥有的 app R library shiny library shinydashboard library shinyBS
  • 当已经有新帧时如何跳过 didReceiveFrame ?

    在 webrtc 应用程序中 有一个名为 didReceiveFrame 的回调 当有新帧要渲染时会调用该回调 它将新帧作为参数传递 并且可以从该帧中提取纹理 但是 如果由于某种原因主线程被延迟 例如断点 设备旋转 仍然忙于渲染等 那么将为