当前位置: 首页 > 知识库问答 >
问题:

在iOS中通过蓝牙播放时,从内置麦克风录音

芮学
2023-03-14

是否可以从iPhone的内置麦克风接收音频输入,并同时通过蓝牙耳机播放该音频?

我的目标是始终使用内置麦克风作为输入设备,即使输出设备是耳机,因为在我的用例中内置麦克风更方便。

当输出设备是有线耳机时,我知道如何实现我的目标,就像iPhone附带的那种。我只需插入有线耳机,并调用以下方法:

- (void)selectBuiltInMicrophone
{
    AVAudioSession *session = [AVAudioSession sharedInstance];
    for (AVAudioSessionPortDescription *port in session.availableInputs)
        if ([port.portType isEqualToString:AVAudioSessionPortBuiltInMic]) {
            NSError *error;
            [session setPreferredInput:port error:&error];
            break;
        }
}

通过调用上述方法,输入设备将从有线耳机的麦克风切换到iPhone的内置麦克风,而输出设备不受影响,因此iPhone将从内置麦克风录制并通过有线耳机播放。这就是我所期望的。

问题是,当耳机是蓝牙耳机时,此方法不起作用。如果我将蓝牙耳机连接到iPhone,然后调用上述方法,内置麦克风将成为输入设备,这很好,但输出设备也将更改为iPhone的接收器,这很糟糕。

蓝牙耳机的输入和输出似乎被锁定在一起:你要么同时使用它们,要么一个都不使用。我的目标真的不可能实现吗?还是有办法克服明显的局限性?

共有2个答案

邵飞宇
2023-03-14

您可以在通过蓝牙音频设备播放音频时选择特定的麦克风。

  // set audio session category to .playAndRecord. use do-catch if you need error-handling
  try? AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP, .allowBluetooth])

  // check if currentRoute is set to a bluetooth audio device
  let btOutputTypes: [AVAudioSession.Port] = [.bluetoothHFP, .bluetoothA2DP, .bluetoothLE]
  let btOutputs = AVAudioSession.sharedInstance().currentRoute.outputs.filter { btOutputTypes.contains($0.portType) }

  // if so, set preferred audio input to built-in mic
  if !btOutputs.isEmpty {
     let builtInMicInput = AVAudioSession.sharedInstance().availableInputs?.filter { $0.portType == .builtInMic }.first
     try? AVAudioSession.sharedInstance().setPreferredInput(builtInMicInput)
  } else {
     // set default input
     try? AVAudioSession.sharedInstance().setPreferredInput(nil)
  }

  try? AVAudioSession.sharedInstance().setActive(true)

或者你可以按照这里的详细说明https://developer.apple.com/library/archive/qa/qa1799/_index.html

编辑:事实证明,在使用蓝牙耳机作为输出的同时,使用内置麦克风作为输入有更简单的方法。只需像这样设置AVAudio会话的分类选项

// allow only A2DP. you may set other mode or options, excluding .allowBluetooth
try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.allowBluetoothA2DP])

通过删除< code >。allowBluetooth来自AVAudioSession的< code>categoryOptions,它不允许HFP,这是一种使用蓝牙设备作为输入的协议。因此,它会自动将其输入路径改为内置麦克风。

如果您有多个输入(例如,如果您的设备连接到usbAudio或lineIn输入设备),您仍然需要使用< code>setPreferredInput来将您的输入路由更改为内置麦克风。

慕麒
2023-03-14

无法同时接收来自 iPhone 内置麦克风的音频输入,也无法通过蓝牙耳机播放该音频

  1. 有一种预防方法,你可以像有声电影一样使用。
  2. 您必须创建两个会话。意味着在录制音频时,您必须使用录播启用音频会话。
  3. 播放时,您必须将选项设置为音频(允许蓝牙)。
  4. 录音时,您必须设置录音和播放。
 类似资料:
  • 我正在尝试获取传入的麦克风音频并将其流式传输到另一部iPhone。基本上是一个电话,但通过蓝牙。我有音频通过进入: 然后我尝试使用来自这里的-StreamReader from@martin-r 使用: 然后使用以下方法将数据发送到另一台设备: 我将行转换为NSData,然后使用dispatch_after 0.5秒不断运行,我通过蓝牙将其发送到另一台设备。 它似乎不起作用,我不认为这是一种实用的

  • 我正在使用语音识别应用程序。蓝牙耳机成功连接到我的android设备后,我想在内置麦克风和耳机麦克风之间自由切换音频输入,如何做到?

  • 我有一个蓝牙耳机(可以播放立体声音乐)连接到我的android手机(android 4.4.3)。现在,我希望我的代码能够播放立体声音乐并从耳机中录制音频,这两种方式的采样率都很高(44100)。我在以下帖子中遵循了这些解决方案。 如何使用蓝牙耳机录制声音 通过与Android设备配对的蓝牙耳机捕获音频 我的基本代码如下所示。 权限: 打开蓝牙Sco的代码: 播放立体声音乐的代码: 录制音频的代码

  • 在遵循类似的教程之后,我正在使用MediaRecorder类用相机录制视频 http://androidcookbook.com/Recipe.seam;jsessionid=40151FCD26222877E151C3EEFB406EED?recipeId=1375 我希望在录音时能够使麦克风静音/取消静音。怎么可能呢? 我正在开始设置音频源 但是如果我想在某个时候录制没有声音的音乐呢?

  • 我正在尝试创建一个麦克风应用程序,在会议中用作观众的真正麦克风。我们将把Android设备连接到Wi-Fi局域网,任何人都可以从他们的应用程序中触发麦克风,向他人讲话。数据将进入局域网内的服务器Java程序,并从那里进入扬声器。 我不知道该怎么做。有人能帮我吗???提前谢谢

  • 问题内容: 我想用Java制作一个实时的语音聊天程序,但是我对用Java录制/播放声音一无所知,因此,在Google的帮助下,我认为我能够使用以下内容将麦克风录制到字节数组中: 因此,据我所知,如果我调用out.toByteArray();,我应该已经从麦克风上录制了一个字节数组的声音。(运行上述命令没有错误,但是由于我不希望将其输出到文件中并且没有这样做,所以没有办法证明它是否实际记录了) 现在