我正在制作视频录制应用,并且需要能够使用蓝牙麦克风作为音频输入(如果已连接)。
我有以下代码来配置AVCaptureSession的音频输入:
self.captureSession.usesApplicationAudioSession = YES;
self.captureSession.automaticallyConfiguresApplicationAudioSession = NO;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:nil];
self.microphone = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
audioInput = [AVCaptureDeviceInput deviceInputWithDevice:self.microphone error:&error];
if ([self.captureSession canAddInput:audioInput])
{
[self.captureSession addInput:audioInput];
}
问题是,蓝牙麦克风永远不会显示为可用的捕获设备(尽管它已正确配对)。打印出[AVCaptureDevice devices]会导致:
所以,无论我做什么,音频总是来自iPad的内置麦克风。
答案 0 :(得分:0)
我也在SFSpeechRecognizer
的背景下遇到了这个问题。我想从蓝牙麦克风录制音频并将其转换为文本。首先,我在AVAudioSession
中切换了输入:
// Activate bluetooth devices for recording
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryRecord, with: [.allowBluetooth])
try? AVAudioSession.sharedInstance().setActive(true)
// Configure a bluetooth device for recording if available
let bluetoothRoutes = [AVAudioSessionPortBluetoothHFP]
let availableInputs = AVAudioSession.sharedInstance().availableInputs
if let bluetoothInput = (availableInputs?.filter{ bluetoothRoutes.contains($0.portType) })?.first {
try? AVAudioSession.sharedInstance().setPreferredInput(bluetoothInput)
}
但即使将AVCaptureSession的automaticallyConfiguresApplicationAudioSession
属性设置为false,AVCaptureDevice.devices()
也只显示内置麦克风,并且没有录制蓝牙的任何音频。
我最终将AVCaptureDevice
替换为AVAudioRecorder
,SFSpeechRecognizer
确实尊重路线更改。现在我可以将音频录制到一个临时文件中,然后传递给gc.collect()
。