与Apple Airpods一起使用的AVAudioRecorder / AVAudioSession

djn*_*ely 5 bluetooth objective-c ios avaudiosession

我看到这里已经问过一个问题:

AirPods不能用作录音机应用程序的输入源

我已经使用此线程签入,但没有响应。

但是,有谁知道AVAudioRecorder是否/为什么不能将AirPods用作在应用中录制音频的输入设备?我通过内置麦克风以及其他BT设备(节拍器,cheapo BT扬声器电话等)进行音频记录,但是使用AirPods时我无法捕获音频。

另外,当要记录时,我将遍历可用的输入,并在这种情况下将输入强制为BT设备(请参见下面的代码)。再次适用于除AirPods之外的所有其他BT设备。

有什么想法吗?关于我们在这里做错什么的任何指导都是很棒的。这真令人发疯。

NSError *error;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryRecord withOptions:audioSession.categoryOptions|AVAudioSessionCategoryOptionAllowBluetooth
                    error:&error];
[audioSession setActive:YES error:nil];

NSLog(@"Data sources: %@", [audioSession availableInputs]);
// Data sources: ("<AVAudioSessionPortDescription: 0x1706071b0, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Bottom>",
"<AVAudioSessionPortDescription: 0x170611bd0, type = BluetoothHFP; name = Dan\U2019s AirPods; UID = 50:32:37:E0:90:37-tsco; selectedDataSource = (null)>"    

for (AVAudioSessionPortDescription *desc in [audioSession availableInputs]){
    NSLog(@"Port desc: %@", desc.portType);
    // Loop: 1) Port desc: MicrophoneBuiltIn
    //       2) Port desc: BluetoothHFP

    if (desc.portType == AVAudioSessionPortBluetoothHFP) {
        NSLog(@"Trying to change preferred input");
        NSError *error;
        BOOL didSet = [audioSession setPreferredInput:desc error:&error];
        NSString *didSetString = didSet ? @"True" : @"False";
        NSLog(@"Post change preferred input: %@, error: %@", didSetString, error);
        // Post change preferred input: True, error: (null)
    }
}
Run Code Online (Sandbox Code Playgroud)

djn*_*ely 5

证明了我们与所设置类别有关的问题。由于各种蓝牙输出设备的问题,我们准备将音频类别设置为并保持设置为AVAudioSessionCategoryPlayback除准备录制时以外的其他类别。

根据此堆栈文章:AVAudioSession:某些蓝牙设备在我的应用程序上无法正常工作

在上面的代码中,我们将类别切换到AVAudioSessionCategoryRecord要记录的位置。虽然此方法适用于内置麦克风和其他蓝牙设备,但不适用于AirPods。而是将类别设置为AVAudioSessionCategoryPlayAndRecord允许录制与AirPods一起使用。

然后,我仍然在整个应用程序的会话中维护“仅播放”类别,以进行音频播放。仅在要录制音频时切换到PlayAndRecord。

附带说明:Apple不会将AirPods列为MFi设备。 https://mfi.apple.com/MFiWeb/getFAQ.action#1-1