iOS 相机:“AVCaptureAudioDataOutput”动态激活音频会话,避免背景音乐卡顿

2023-11-23

我使用 AVFoundation 创建了一个相机,它能够使用以下命令录制视频和音频AVCaptureVideoDataOutput and AVCaptureAudioDataOutput。我创建捕获会话,连接所有输入以及视频和音频数据输出,然后相机闲置。用户现在可以开始视频录制。

Problem

问题是,在我开始捕获会话后(captureSession.startRunning()),背景音乐断断续续。我认为这是因为一旦捕获会话开始运行,AVCaptureAudioDataOutput内部激活 AVAudioSession (AVAudioSession.setActive(...)),我不希望它这样做。我希望它处于空闲状态(并且不提供任何音频输出缓冲区),直到我明确激活音频会话(一旦用户开始录制)。

这真的很烦人,因为相机是我们应用程序中的开始屏幕,每次用户打开或关闭应用程序时,他的音乐都会断断续续。

我知道这在某种程度上是可能的,因为 Snapchat 就是这样工作的——你打开应用程序,背景音频就会继续流畅地播放。开始录制后,背景音乐会出现轻微的卡顿,但相机会平稳运行,并在短暂的卡顿结束后开始录制。

My code:

func configureSession() {

    captureSession.beginConfiguration()

    // Video, Photo and Audio Inputs
    ...

    // Video Output
    ...

    // Audio Output
    audioOutput = AVCaptureAudioDataOutput()
    guard captureSession.canAddOutput(audioOutput!) else {
      throw CameraError.parameter(.unsupportedOutput(outputDescriptor: "audio-output"))
    }
    audioOutput!.setSampleBufferDelegate(self, queue: audioQueue)
    captureSession.addOutput(audioOutput!)

    try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord,
                                                    options: [.mixWithOthers,
                                                              .allowBluetoothA2DP,
                                                              .defaultToSpeaker,
                                                              .allowAirPlay])

    captureSession.commitConfiguration()
}

我尝试过的

延迟配置AVAudioSession.sharedInstance()

我尝试首先配置AVAudioSession.sharedInstance与类别AVAudioSession.Category.playback,然后切换到.playAndRecord一旦我想开始录制音频。

这不起作用,并且AVCaptureSessionRuntimeError启动相机后立即调用事件并显示错误代码-10851, 意思是kAudioUnitErr_InvalidPropertyValue。我认为这意味着AVCaptureAudioDataOutput不允许从音频会话进行录制,但我现在不想这样做 - 它应该处于空闲状态。

延迟添加AVCaptureAudioDataOutput output

我尝试不添加音频输出(AVCaptureAudioDataOutput)在开始时,只有在用户开始录音时才“按需”添加它,虽然这对于背景音乐效果很好(开始时没有口吃,一旦用户开始录音只有短暂的口吃,这正是我想要的) ,它使预览冻结了很短的时间(因为捕获会话正在通过重新配置beginConfiguration+ 音频输出添加 +commitConfiguration)

有谁知道如何实现我在这里想要做的事情 - 或者 Snapchat 是如何做到的?任何帮助表示感谢,谢谢!


终于想通了。我只是创建了一个单独的AVCaptureSession专门针对我与主捕获会话同步的音频输入/输出masterClock。然后我可以即时启动/停止辅助捕获会话(在开始录制之前不久)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 相机:“AVCaptureAudioDataOutput”动态激活音频会话,避免背景音乐卡顿 的相关文章

  • 进入/退出编辑模式时重绘 UITableViewCell

    我有一个表格视图 其中根据表格是否正在编辑 单元格的构建方式有所不同 具体来说 处于编辑模式时选择样式为无 非编辑模式时选择样式为蓝色 当我从一个单元转换到另一个单元时 我注意到某些单元格没有更新 快速的日志记录告诉我 即使单元格的外观发生
  • 调整 SKShapeNode 的大小

    如何调整 SKShapeNode 的大小 到目前为止我尝试过的 调整框架大小 box frame width 10 给出错误Cannot assign to the result of this expression SKAction le
  • PhoneGap/Cordova:如何使用cookies(iOS)?

    我有一个适用于 iOS 的 PhoneGap Corodova 项目 在 iOS 模拟器上构建时 我使用了 Jquery Cookies 它们很好 但是 既然我的设备上有该应用程序用于测试 它们就不再工作了 我猜这只是 iOS 不支持的东西
  • UITextField 文本更改事件

    如何检测文本字段中的任何文本更改 委托方法shouldChangeCharactersInRange适用于某些东西 但它并不能完全满足我的需求 因为在它返回 YES 之前 textField 文本不可用于其他观察者方法 例如在我的代码中ca
  • 显示不带字母的数字键盘

    iOS 默认数字键盘中是否有隐藏数字下方字母的选项 对于某些电话语言 键盘显示时不带字母 抱歉 你所要求的是不可能的 这取决于键盘语言 只有用户可以更改键盘语言 我希望这能帮到您
  • 退出我的应用程序后未显示蓝色横幅“您的应用程序正在使用您的位置”

    我的应用程序在后台模式下使用核心位置 当应用程序处于后台模式并定期发送 GPS 坐标时 不会显示蓝色横幅 您的应用程序正在使用您的位置 例如谷歌地图应用程序 知道我可能错过了什么吗 要显示蓝色条 您应该 1 启用Background Loc
  • 编码的 nsdata utf8 json,在 ios 中带有重音字符

    我向网络服务器发出一个发布请求 该服务器用 JSON 回答我 这是响应的标头 Cache Control private Content Length 826 Content Type application json charset ut
  • 在 Swift 中获取 UIImage 的主颜色

    我正在尝试在 Swift 中获取 UIImage 的主颜色 并尝试移植这段代码 https stackoverflow com questions 13694618 objective c getting least used and mo
  • BUG - 在 IOS 中没有选择标签的完成按钮

    我正在使用最新的离子并有一个简单的选择标签
  • iOS 8 支持动态链接吗?

    直到 iOS7 之前 出于安全考虑 Apple 都不支持动态链接 开发人员之间的代码重用通常依赖于静态库 这些静态库是作为应用程序可执行文件的一部分构建的 在 iOS8 中引入扩展似乎稍微改变了这一点 因为扩展是单独的可执行文件 扩展及其包
  • 创建类似于邮件应用程序菜单的 iPhone 弹出菜单

    当您想要回复消息时 我想创建一个类似于邮件应用程序中的弹出菜单 我在多个应用程序中看到过这一点 所以我不确定框架中是否内置了某些内容或一些示例代码 在 Swift 中创建操作表 代码已使用 Swift 5 进行测试 从 iOS 8 开始 U
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • tableView.dequeueReusableCellWithIdentifier() 导致应用程序挂起

    原帖 我们最近将我们的应用程序转换为 Swift 2 0 和 iOS9 我看到的一个奇怪的问题是调用 tableView dequeueReusableCellWithIdentifier 会导致应用程序挂在模拟器中 The code fu
  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • 删除 UICollectionView 中的最后一个单元格会导致崩溃

    您好 我正在使用自定义 UICollectionView https github com SureCase WaterfallCollectionView https github com SureCase WaterfallCollec
  • 允许的 APNS 持续连接数量是多少?

    我正在尝试编写服务器端代码来为我的应用程序发送推送通知 根据 Apple 的建议 我计划保留连接并根据需要发送推送通知 Apple 还允许打开和保留多个并行连接以发送推送通知 您可以与同一网关或多个网关实例建立多个并行连接 为此 我想维护一
  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB
  • Objective-C:在哪里定义宏以便随处可用?

    我有一个 iOS 应用程序 它在许多视图控制器中使用相同的字符串 数字等 所以我认为最好在一个文件中定义这些常量并在所有视图控制器实现中使用它 优点是更改一个数字 我只需要做一次 而不是在所有视图控制器中都使用该数字 实际上 我的 h 文件
  • 如何在 iOS 上压缩 Realm DB?

    我想定期压缩 iOS 上的 Realm 实例以回收空间 我认为该过程是将数据库复制到临时位置 然后将其复制回来并使用新的default realm 文件 我的问题是Realm 其行为就像单例并回收对象 因此我无法真正关闭它并告诉它打开新的
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex

随机推荐

  • AddOAuth linkedin dotnet core 2.0

    我正在使用 dotnet core 我想在网站上设置 LinkedIn 身份验证 因为 LinkedIn 没有像 facebook google 和 twitter 这样的默认身份验证构建器 我决定使用通用实现 如下所示 services
  • 时间:2019-03-17 标签:c#networklogin

    如何在 C 中以编程方式执行网络登录 例如访问共享驱动程序 可以通过尝试通过资源管理器打开共享或通过 net use shell 命令来实现相同的目的 P Invoke 调用WNetAddConnection2会成功的 看here了解更多信
  • NetBeans - “sun-resources.xml”与“glassfish-resources.xml”

    您知道 Netbeans 如何决定应用程序范围的资源使用哪个文件名 sun resources xml or glassfish resources xml 该名称是可配置的还是硬编码的 据我了解 GlassFish 支持sun resou
  • 在 WebGL 着色器中获取准确的整数模

    我想获得精确的模数x and y在 WebGL 片段着色器中 x and y是整数 Graphing mod x y we get the following 用于生成红黑矩形的实际代码是 gl FragColor vec4 mod flo
  • 将鼠标悬停在对象上时获取对象的“原始”(非悬停)背景颜色

    我可以使用以下函数获取任何元素的背景颜色 example css background 然而 就我而言 鼠标移动到该元素上时 由于 CSS 我收到了修改后的颜色 hover伪类 有什么办法可以得到原色吗 就像是 example cssWit
  • 多行编辑文本,其中部分不可编辑,例如填空

    我需要一个包含 textview 和 edittext 的视图 例子 Yay you made it to We should hang out feel to follow me 上面的 可以是任意长度 并且最后应该感觉像一个段落 上面给
  • 如何加入 TransactionScope?

    简洁版本 我如何加入正在进行的交易范围 长版 如果您使用交易范围 您可以创建一个 周围的 交易 using TransactionScope scope new TransactionScope stuff happens then you
  • 获取屏幕比例

    我们可以获得屏幕的分辨率和内容Screen班级 所以 我们应该使用Screen WorkingArea Width and Screen WorkingArea Height 如果我们想在屏幕中央放置一些东西 但是 在 Windows 8
  • read() 和 fread() 有什么区别?

    我正在阅读linux工具的源代码坏块 他们使用read 在那里发挥作用 和标准C有区别吗fread 功能 我没有将参数视为差异 read 是低级 无缓冲的读取 它在 UNIX 上进行直接系统调用 fread 是 C 库的一部分 并提供缓冲读
  • Paypal 快速结账优惠券代码

    我在我的网站上使用 Paypal Express Checkout 系统 但我想放一个优惠券 折扣 代码区域 如果代码为真 则会减少 如 GoDaddy com 的购物车系统 您知道我应该从哪里开始吗 我没有使用任何电子商务框架 我知道这是
  • 使用自定义分隔符通过 Spring Boot 生成 DDL

    我想使用 spring boot v1 4 3 和 JPA Hibernate 5 0 11 生成创建和删除 ddl 脚本 我发现的大多数答案都使用javax persistence schema generation特性 例如 https
  • 数据框中每行的最小值

    我尝试计算多列的最小值 按行min 在数据框中 但是min函数自动返回每列整体的最小值 而不是单独返回每行的最小值 我确定我在这里错过了一些非常简单的东西 任何想法都非常感激 x lt c 1 2 7 y lt c 1 5 4 minIwa
  • 在 Android 中添加具有正确格式的项目符号

    我想在 Android 文本中显示项目符号 我已经成功添加它们了 我在网上搜索发现可以添加项目符号 但是如果文本超过一行 它就不会像 html 列表那样遵循正确的间距 请参阅下面的屏幕截图 我使用以下代码来添加项目符号 String lon
  • 如何从虚拟键代码转换为 System.Windows.Forms.Keys

    如果我使用 win32 调用拦截按键操作 我现在就有了一个按键代码 有没有办法将其转换为 System Windows Forms Keys 值 Use KeyInterop KeyFromVirtualKey
  • go lang 中 amqp.Dial 线程安全时是否每次都创建连接

    正如 RabbitMQ 文档中提到的 tcp 连接的建立成本很高 因此 引入了通道的概念 现在我遇到了这个example 在里面main 每次发布消息时它都会创建连接 conn err amqp Dial amqp guest guest
  • 为什么使用 uImage 而不是 zImage

    我正在尝试了解 zImage 和 uImage 之间的区别 以我的理解uImage是通过运行得到的mkimage on the Image结果它添加了一个 U Boot 包装器 我不知道它到底包含什么 其中包含header加上加载地址和入口
  • 以 root 身份运行 python 脚本

    我有以下脚本 usr bin env python import sys import pyttsx def main print running
  • 如何将 Firebase Twitter 身份验证与 React Native 结合使用?

    如何将 Firebase Twitter 身份验证与 React Native 结合使用 我尝试了下面的两个代码参考https www firebase com docs web guide login twitter html var F
  • 需要正则表达式来查找两个标记之间的子字符串

    我怀疑这个问题已经在某个地方得到了回答 但我找不到它 所以 我需要从较大字符串中的两个标记之间提取一个字符串 其中第二个标记可能会再次出现 这意味着 伪代码 myString A abc B def 3 123 C 123 myB getI
  • iOS 相机:“AVCaptureAudioDataOutput”动态激活音频会话,避免背景音乐卡顿

    我使用 AVFoundation 创建了一个相机 它能够使用以下命令录制视频和音频AVCaptureVideoDataOutput and AVCaptureAudioDataOutput 我创建捕获会话 连接所有输入以及视频和音频数据输出