2017-10-06 6 views
0

je vois la question déjà posée ici:AVAudioRecorder/AVAudioSession avec Apple AirPod

AirPods not working as an input source for Voice Recorder App

J'ai vérifié avec ce fil, mais pas de réponse. Mais, est-ce que quelqu'un sait si/pourquoi AVAudioRecorder pourrait ne pas être en mesure d'utiliser les AirPods comme périphérique d'entrée pour l'enregistrement audio dans une application? J'ai l'enregistrement audio fonctionnant par l'intermédiaire des micros intégrés aussi bien qu'avec d'autres appareils de BT (Beats, chose de téléphone de haut-parleur de BT, etc.) mais en travaillant avec les AirPods je suis incapable de capturer l'acoustique.

En outre au moment d'enregistrer, je suis en boucle sur les entrées disponibles et en forçant l'entrée à l'appareil BT (voir le code ci-dessous) dans ce cas les AirPods. Encore une fois, fonctionne pour tous les autres appareils BT, sauf les AirPods.

Pensées? Toute orientation sur ce que nous faisons mal ici serait géniale. Cela a été exaspérant.

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) 
    } 
} 

Répondre

1

Il s'avère que nous avions affaire à la catégorie en cours de définition. En raison des problèmes que nous avions avec différents périphériques de sortie Bluetooth, nous définissons et maintenons la catégorie audio définie sur AVAudioSessionCategoryPlayback, sauf lorsque nous sommes prêts à enregistrer.

par ce poste Stack: AVAudioSession: Some Bluetooth devices are not working properly on my App

Dans le code ci-dessus nous passons la catégorie vers AVAudioSessionCategoryRecord avant que nous soyons sur le point d'enregistrement. Bien que cela fonctionne pour les micros intégrés et autres périphériques Bluetooth, cela ne fonctionnait pas avec AirPods. Au lieu de cela, définir la catégorie à AVAudioSessionCategoryPlayAndRecord permet à l'enregistrement de fonctionner avec les AirPods. J'ai alors toujours maintenir une catégorie Lecture seule pour la session tout au long de l'application pour la lecture audio. Ne passez à PlayAndRecord que lorsque vous êtes sur le point d'enregistrer de l'audio.

En remarque: Apple ne liste pas les AirPods en tant que périphérique MFi. https://mfi.apple.com/MFiWeb/getFAQ.action#1-1

0

Je pense que AirPod sont MFI (Made for iPhone) accessoires qui signifie que la communication Bluetooth passe à travers le cadre ExternalAccessory https://developer.apple.com/documentation/externalaccessory

Voici démonstration de pomme: https://developer.apple.com/library/content/samplecode/EADemo/Introduction/Intro.html

Astuce: Nom du protocole doit être mis dans Info.plist dans UISupportedExternalAccessoryProtocols clé

Plus de détails: https://mfi.apple.com/MFiWeb/getFAQ.action

+0

Merci. Je vais regarder à travers cela et voir si ça aide. – djneely