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.
Haben Sie einen Code, für den er nicht funktioniert? – Abizern
@Abizem Ich habe meine Antwort bearbeitet. –
Werfen Sie einen Blick auf diese Apple Tech Note: http://developer.apple.com/library/mac/#technotes/tn2091/_index.html – sangony