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”动态激活音频会话,避免背景音乐卡顿 的相关文章

随机推荐

  • 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 我创建捕获会话 连接所有输入以及视频和音频数据输出