2013-06-19 3 views
9

Ich habe verwendet, um code den Stream die Audio-Ausgabe von Mikrofon zu verfolgen. Ich möchte das hintere Mikrofon für die Aufnahme auswählen. Ich habe gelesen, dass das Einstellen von kAudioSessionProperty_Mode auf kAudioSessionMode_VideoRecording die Arbeit erledigen kann, aber ich bin mir nicht sicher, wie ich das mit meinem Code verwenden soll. Kann mir jemand helfen, diesen Parameter erfolgreich zu setzen?Verwenden Sie das hintere Mikrofon des iPhone 5

Ich habe diese Zeilen zur Einstellung der Eigenschaft

status = AudioUnitSetProperty(audioUnit, 
           kAudioSessionProperty_Mode, 
           kAudioSessionMode_VideoRecording, 
           kOutputBus, 
           &audioFormat, 
           sizeof(audioFormat)); 
checkStatus(status); 

aber seine nicht funktioniert.

+1

Haben Sie einen Code, für den er nicht funktioniert? – Abizern

+0

@Abizem Ich habe meine Antwort bearbeitet. –

+0

Werfen Sie einen Blick auf diese Apple Tech Note: http://developer.apple.com/library/mac/#technotes/tn2091/_index.html – sangony

Antwort

6

in Apple Entwickler-Bibliothek click here

können Sie eine bestimmte Methode sehen

struct AudioChannelLayout { 
    AudioChannelLayoutTag  mChannelLayoutTag; 
    UInt32     mChannelBitmap; 
    UInt32     mNumberChannelDescriptions; 
    AudioChannelDescription mChannelDescriptions[1]; 
}; 
typedef struct AudioChannelLayout AudioChannelLayout; 

Sie AudioChannelDescription bis 2 für die Verwendung von Sekundär Mikrofon

+1

Ihre Antwort zeigt auf beide Mikrofone gleichzeitig zu verwenden. Die Frage ist, wie man nur das hintere Mikrofon benutzt. Oder bin ich falsch? – sangony

+0

https://developer.apple.com/library/ios/qa/qa1799/_index.html – Iwaz

5

Ich habe ein wenig gesucht und gelesen. Schließlich endete in der AVCaptureDevice Class Reference. Der Schlüsselbefehl für Sie lautet NSLog(@"%@", [AVCaptureDevice devices]);. Ich lief das mit meinem iPhone angeschlossen und bekam dies:

"<AVCaptureFigVideoDevice: 0x1fd43a50 [Back Camera][com.apple.avfoundation.avcapturedevice.built-in_video:0]>", 
"<AVCaptureFigVideoDevice: 0x1fd47230 [Front Camera][com.apple.avfoundation.avcapturedevice.built-in_video:1]>", 
"<AVCaptureFigAudioDevice: 0x1fd46730 [Microphone][com.apple.avfoundation.avcapturedevice.built-in_audio:0]>" 

Nur ein Mikrofon erscheint jemals in der Liste. Um deine Frage zu beantworten, kann es (noch) nicht getan werden.

+0

, aber es gibt Apps auf appstore, die von hinten Mikrofon erfassen. –

+0

Ich weiß nicht, was ich Ihnen sagen soll. Es ist wahr, dass das iPhone 2 Mikrofone hat, aber das heißt nicht, dass man kontrollieren kann, welches man gerade benutzt. Das obere Mikrofon scheint verwendet zu werden, wenn ein Video aufgenommen wird oder wenn das Lautsprechertelefon aktiviert ist. Das untere Mikrofon wird für Telefonanrufe, Nur-Audio-Aufnahmen und Rauschunterdrückungsfilter verwendet. Soweit ich das beurteilen kann, möchte Apple zunächst einmal selbst entscheiden, wie und wann die beiden Mikrofone verwendet werden. Werfen Sie einen Blick auf diesen Link http://www.iphoneincanada.ca/how-to/how-to-use-your-iphone-44s-microphones-properly/ – sangony

3

Ihr Code ändern können:

status = AudioUnitSetProperty(audioUnit, 
           kAudioSessionProperty_Mode, 
           kAudioSessionMode_VideoRecording, 
           kOutputBus, 
           &audioFormat, 
           sizeof(audioFormat)); 
checkStatus(status); 

Funktioniert nicht, da der Code nicht korrekt ist ect. Audio SESSIONS sind keine Eigenschaften von Audio UNITS. Die Audiositzung beschreibt das allgemeine Verhalten Ihrer App mit Hardwareressourcen und wie sie mit anderen Anforderungen derselben Ressourcen durch andere Apps und andere Teile des Systems zusammenarbeitet. Es ist die beste Möglichkeit, die Kontrolle über die Eingabe- und Ausgabehardware zu übernehmen, bietet Ihnen jedoch keine vollständige Kontrolle, da die allgemeine Benutzerfreundlichkeit für iOS-Frameworks oberste Priorität hat.

Ihre App verfügt über eine einzelne Audiositzung, die Sie initialisieren, aktivieren und deaktivieren sowie Eigenschaften von abrufen und festlegen können. Seit ios6 können die meisten dieser Eigenschaften mit dem AVFoundation Singleton AVAudioSession-Objekt angesprochen werden, aber um vollen Zugriff zu erhalten, möchten Sie immer noch die Core Audio Funktionssyntax verwenden.

Um den Audio-Session-Modus auf "Video-Recording" mit AVFoundation setzen Sie so etwas tun würden:

- (void) configureAVAudioSession 
    { 
     //get your app's audioSession singleton object 
     AVAudioSession* session = [AVAudioSession sharedInstance]; 

     //error handling 
     BOOL success; 
     NSError* error; 

     //set the audioSession category. 
     //Needs to be Record or PlayAndRecord to use VideoRecording mode: 

     success = [session setCategory:AVAudioSessionCategoryPlayAndRecord 
           error:&error] 

     if (!success) NSLog(@"AVAudioSession error setting category:%@",error); 

     //set the audioSession mode 
     succcess = [session setMode:AVAudioSessionModeVideoRecording error:&error]; 
     if (!success) NSLog(@"AVAudioSession error setting mode:%@",error); 

     //activate the audio session 
     success = [session setActive:YES error:&error]; 
     if (!success) NSLog(@"AVAudioSession error activating: %@",error); 
     else NSLog(@"audioSession active"); 

    } 

Die gleiche Funktionalität mit Core Audio-Funktionen (ios5 und unten). checkStatus ist die Fehlerbehandlungsfunktion aus Ihrem Codebeispiel.

- (void) configureAudioSession 
    { 
     OSStatus status; 

     //initialise the audio session 
     status = AudioSessionInitialize (NULL 
             //runloop 
             , kCFRunLoopDefaultMode 
             //runloopmode 
             , NULL 
             //MyInterruptionListener 
             , (__bridge void *)(self) 
             //user info 
             ); 

     //set the audio session category 
     UInt32 category = kAudioSessionCategory_PlayAndRecord; 
     status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory 
              , sizeof(category) 
              , &category); 
                 checkStatus(status); 

     //set the audio session mode 
     UInt32 mode = kAudioSessionMode_VideoRecording; 
     status = AudioSessionSetProperty(kAudioSessionMode_VideoRecording 
              , sizeof(mode) 
              , &mode); 
     checkStatus(status); 

     //activate the audio session 
     status = AudioSessionSetActive(true); 
     checkStatus(status); 


    } 

Der Grund, warum Sie gesagt haben, ist Video-Recording-Modus zu verwenden, da es die einzige Art ist, dass Sie jede Hoffnung, direkt den hinteren Mikrofon Auswahl geben. Wählen Sie das Mikrofon, das der Videokamera am nächsten ist.

"Bei Geräten mit mehr als einem eingebauten Mikrofon wird das der Videokamera am nächsten liegende Mikrofon verwendet."(Von Apple AVSession Class Reference)

Dies legt nahe, dass die Videokamera müssen aktiv sein, wenn das Mikrofon verwendet wird, und die Wahl der Kamera von vorne nach hinten die Parameter, die das System das entsprechende Mikrofon wählen verwendet. Es kann sein, dass videofreie Apps, die das hintere Mikrofon verwenden (wie your example) tatsächlich einen Videoeingangsstrom von der hinteren Kamera bekommen und nichts damit machen. Ich kann dies nicht testen, da ich keinen Zugang zu einem habe iPhone 5. Ich sehe, dass die "Babyscope" -App, die Sie erwähnten, eine völlig andere App zum Laufen auf ios5 vs. ios4 hat.

Die Antwort von Kuriakose ist irreführend: AudioChannelLayout ist ein Beschreibung einer Audiospur, hat keinen Einfluss auf die Audio-Hardware, die bei der Aufnahme verwendet wird. Die Antwort von Sangony zeigt uns, dass Apple nicht wirklich will, dass wir die volle Kontrolle über die Hardware haben. Ein großer Teil des Audio-Managements auf iOS ist ein Versuch, uns von der direkten Kontrolle abzuhalten, um sowohl die Erwartungen der Benutzer (des Audio-I/O-Verhaltens zwischen Apps) als auch die Hardware-Einschränkungen beim Umgang mit Live-Signalen zu berücksichtigen.

Verwandte Themen