将现场音频从线路输入路由到 AirPods?

2024-04-13

有没有办法将来自有线线路输入的音频直接路由到 AirPods?

目前,我正在创建一个.playAndRecord音频会话。已配对 AirPods。后来,与AVAudioEngine我将输入设备直接连接到输出设备。

engine.connect(
    engine.inputNode,
    to: engine.outputNode,
    format: engine.inputNode.inputFormat(forBus: 0)
)

效果很好,我可以直接在耳朵里听到 AirPods 麦克风发出的现场(!)声音。 ???? 但随后我连接了线路输入电缆,不幸的是,它也覆盖了线路输入的输出(不过,我可以很好地读取计量电平)。如果我连接 AirPods,那么输入和输出都会更改为 AirPods。

有没有办法将输出设备重新路由到AirPods,但保持输入设备不变?


更新:我尝试使用手动设置输入端口(线路输入)setPreferredInput,但一旦选择输入,输出也会被调整(到有线设备)。

更新:我尝试用AVRoutePickerView https://developer.apple.com/documentation/avkit/avroutepickerview and MPVolumeView https://developer.apple.com/documentation/mediaplayer/mpvolumeview,但都产生了相同的结果。如果我选择一个新的输出,输入也会被修改。

UPDATE: AudioBus https://audiob.us/app 就是这样做的,我可以将有线耳机设置为输入,将 AirPods 设置为输出,效果非常好。所以这绝对是可能的,我只是不知道该使用什么API。实际上,AudioBus 都无法将音频共享给两套 AirPods。


是的! ???? 但是,它仅在使用以下命令创建音频会话时才有效allowBluetoothA2DP 选项(根据@RobNapierabove https://stackoverflow.com/questions/71006555/route-live-audio-from-line-in-to-airpods#comment125554621_71006555)。它是一个仅输出的配置文件,因此它不路由来自蓝牙设备的输入 at all.

A2DP 是一种立体声、仅输出配置文件,适用于更高带宽的音频用例,例如音乐播放。如果您将应用程序的音频会话配置为使用 A2DP 端口,系统会自动路由到 A2DP 端口。ambient, soloAmbient, or playback类别。

从 iOS 10.0 开始,使用playAndRecord类别还可以允许将输出路由到配对的蓝牙 A2DP 设备。要启用此行为,请在设置音频会话的类别时传递此类别选项。

你可以让它与一个简单的声音管理器一起工作,如下所示。

class Sound {
    
    ...

    private var session: AVAudioSession {
        AVAudioSession.sharedInstance()
    }
    
    private let engine = AVAudioEngine()
    
    init() {
        setupAudioSession()
    }
    
    func setupAudioSession() {
        do {
            try session.setCategory(
                .playAndRecord,
                options: [
                    .allowBluetoothA2DP, // ????
                    .allowAirPlay
                ]
            )
            try session.setActive(true)
        } catch {
            print("Could not configure and activate session. \(error)")
        }
    }
    
    func start() {
        engine.connect(
            engine.inputNode,
            to: engine.outputNode,
            format: engine.inputNode.inputFormat(forBus: 0)
        )           
        do {
            try engine.start()
        } catch {
            print("Could not start engine. \(error)")
        }
    }

    ...
}

如果你放一个MPVolumeView https://developer.apple.com/documentation/mediaplayer/mpvolumeview用户界面上的某个位置,然后您可以显式选择到蓝牙设备(及更多设备)的路由。但我想即使没有,您也可以通过简单地物理连接/断开设备本身来更改路线。

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

将现场音频从线路输入路由到 AirPods? 的相关文章

随机推荐

  • 使用 JavaScript 关闭移动浏览器选项卡

    我需要一个本机应用程序来启动带有某些 URL 的浏览器 将用户带到移动网站 在移动网站内部 必须有一个按钮可以关闭浏览器 或向本机应用程序发送任何信号 以便用户返回到本机应用程序 目前我正在尝试关闭窗口 但我认为这不会在所有移动设备上起作用
  • 类型错误:validate_on_submit() 缺少 1 个必需的位置参数:'self'

    我正在使用Flask 网络开发 http shop oreilly com product 0636920031116 do教程和我已经遇到并且正在遇到几个错误 我的简单网络应用程序正在利用 FlaskForm 并尝试验证信息 但遇到了一些
  • 通过 PHP 将 MySQL 转换为 XML

    我的服务器上有一个 MySQL 数据库 我希望通过 PHP 以 XML 形式返回某个表 我见过各种将 XML 传输到 MySQL 的方法 但并不是一种容易遵循的相反方法 我应该怎样做呢 只需提取数据并手动将其形成 XML 文档 使用 DOM
  • 什么是http请求期间的连接超时

    我找到了关于 连接超时 的两种解释 当客户端在 timeout 秒内未向服务器发送任何字节时 服务器将关闭套接字连接 它似乎与 HTTP 标头有一些关系 Connection keep alive 如果在此期间未建立套接字连接 则客户端将在
  • 按比例填充 UIStackView

    我正在使用 Storyboard 创建一个由 UITableView 和底部的 UIView 组成的布局 我正在使用 UIStackView 并垂直播放它们 我希望 UITableView 占据高度的 80 UIView 页脚 占据 20
  • Haskell - 需要为类型类定义 Vector2 实例

    newtype Vector2 a Vector2 a a deriving Show Eq class VectorSpace v where vZero Num a gt v a vSum Num a gt v a gt v a gt
  • 在maven中配置不同文件类型的编码?

    我用maven 资源插件 http maven apache org plugins maven resources plugin faq html过滤我的 Maven 项目中的一些资源 在我的父项目中 我有
  • 强制 applicationCache 重新加载缓存文件

    我使用 HTML5 applicationCache 来存储页面的许多 Javascript CSS 图像等文件 如果我更新其中一个文件 浏览器永远不会重新加载它 我已经尝试过以下方法 在页面加载时调用 applicationCache u
  • 如何从vue3中的“setup”方法中“发出”事件?

    我知道我可以打电话给emit方法从setup方法 但是有没有办法从任何其他函数发出事件而不传递emit设置方法中的方法 不是中的功能 methods选项 但是一个useXXX功能 setup函数有两个参数 第一个是props 第二个是con
  • Marshal.Sizeof() 返回意外值

    我正在调试第三方编写的 C 代码 该项目是一个旧的 C 项目 由承包商用 C 重写 我无法访问该承包商 我编写了原始的 C 版本 问题在于 C 代码获取表示通过 UDP 连接接收的数据的结构的大小 该结构体定义为 StructLayout
  • 是否可以从 Cucumber 功能文件中传递 Java-Enum 作为参数

    我目前正在将selenium与Java一起使用 并希望实现cucumber以使测试脚本更具可读性 目前在将参数传递给 java 方法时面临问题 其中 Enum 应该作为参数 我还想知道在迁移当前框架之前 cucumber java 是否还有
  • 如何解决Android Phonegap应用程序SyntaxError:解析错误? (黑屏问题)

    我在用着weinre http people apache org pmuellr weinre docs latest 能够对在 Mac OS X 最新版本 上运行的 Android 模拟器上执行的应用程序进行远程调试 上下文 最终必要
  • 将 SelectList“SelectedValue”传递给控制器​​操作方法

    我有一个注册表单 其中显示用户姓名 文本框 电子邮件 文本框 和部门 选择列表 名称和电子邮件已预先填充 我正在使用 Windows 身份验证 Intranet 应用程序 并且我想将 SelectedValue 作为 Int32 从 Dro
  • 如何使用 mysql 从 php 中的表中返回多行

    我决定为我的家人建立一个梦幻足球网站 但我无法从数据库返回多行 我想要的 进行一次 sql 调用并获取整个玩家列表 以便我可以填充一个对象或对象列表 如果整个桌子都可以归还那就太好了 我的目标是简单地向用户显示待选秀的可用球员列表 目前 通
  • 正则表达式 - 贪婪 - 匹配 HTML 标签、内容和属性

    我正在尝试匹配 HTML 源中的特定 span 标签 lang 属性和标签的内部 HTML 用作返回新字符串的函数的参数 我想用被调用函数的结果替换旧的标签 属性和内容 主题大概是这样的 p Some codesnippet p span
  • Javascript - 从数组中弹出一个值,但不在数组末尾

    例如 我有一个名为 pvalue 的数组 每个数字都是单数 没有重复的 1 2 3 15 20 12 14 18 7 8 sizeof 10 例如 我需要弹出值 15 在此之后的 pvalue 应该是 1 2 3 20 12 14 18 7
  • python中可以使用socket连接不同网络上的多台计算机吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在互联网上寻找答案 但到目前为止还没有找到 我对网络非常陌生 所以请接受我对此几乎一无所知 我能够使用套接字在 LAN 网络上的
  • disableOpenGesture 隐藏不起作用 导航抽屉本机反应

    我们在应用程序中使用导航抽屉来显示侧面菜单 在一些屏幕中 一旦用户尝试执行左 右手势 我们就不想显示此导航抽屉 因此 为此 我们试图隐藏特定的屏幕 手势 导航抽屉 但它不起作用 当用户滑动 左 右 时 抽屉仍然打开 const AppNav
  • 我的 iPad 应用程序会导致设备重新启动吗?

    我有一个 iPad 应用程序 它有一个下载大量地图文件 几千兆数据和数十万个文件 的过程 在我最近的测试版本中 设备有时会在下载过程中重新启动 下载可能需要几个小时 当应用程序重新启动时 它不会留下崩溃报告 我们在运行 4 3 3 的 iP
  • 将现场音频从线路输入路由到 AirPods?

    有没有办法将来自有线线路输入的音频直接路由到 AirPods 目前 我正在创建一个 playAndRecord音频会话 已配对 AirPods 后来 与AVAudioEngine我将输入设备直接连接到输出设备 engine connect