AVAudioRecorder / AVAudioSession与Apple Airpods

时间:2017-10-06 18:54:42

标签: ios objective-c bluetooth avaudiosession

我在这里已经看到了问题:

AirPods not working as an input source for Voice Recorder App

我已经使用此帖子签到但没有回复。

但是,是否有人知道AVAudioRecorder是否/为何无法将AirPods用作在应用中录制音频的输入设备?我通过内置麦克风以及其他BT设备(Beats,廉价BT扬声器电话等)进行录音,但在使用AirPods时我无法捕捉音频。

此外,当即将录制时,我正在循环通过可用输入并强制输入为BT设备(请参阅下面的代码),在这种情况下是AirPods。同样,适用于除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)
    }
}

2 个答案:

答案 0 :(得分:4)

说明我们与正在设置的类别有关的问题。由于我们使用各种蓝牙输出设备时出现问题,我们设置并将音频类别设置为AVAudioSessionCategoryPlayback,除非我们准备好录制。

根据此贴子帖子:AVAudioSession: Some Bluetooth devices are not working properly on my App

在上面的代码中,我们在记录之前将类别切换为AVAudioSessionCategoryRecord。虽然这适用于内置麦克风和其他蓝牙设备,但它不适用于AirPods。相反,将类别设置为AVAudioSessionCategoryPlayAndRecord可以使录制与AirPods一起使用。

然后,我仍然在整个应用程序中为音频播放维护一个仅限播放的类别。仅在录制音频时切换到PlayAndRecord。

作为旁注:Apple未将AirPods列为MFi设备。 https://mfi.apple.com/MFiWeb/getFAQ.action#1-1

答案 1 :(得分:0)

我认为AirPods是MFI(Made for Iphone)配件,这意味着蓝牙通信通过ExternalAccessory框架https://developer.apple.com/documentation/externalaccessory

这是苹果演示: https://developer.apple.com/library/content/samplecode/EADemo/Introduction/Intro.html

提示:协议名称必须放在UISupportedExternalAccessoryProtocols密钥的Info.plist中

更多详情:https://mfi.apple.com/MFiWeb/getFAQ.action