Ваш код:
status = AudioUnitSetProperty(audioUnit,
kAudioSessionProperty_Mode,
kAudioSessionMode_VideoRecording,
kOutputBus,
&audioFormat,
sizeof(audioFormat));
checkStatus(status);
Не работает, поскольку код не является корр. ЭСТ. Audio SESSIONS не являются свойствами Audio UNITS. Аудио-сессия описывает общее поведение вашего приложения с аппаратными ресурсами и то, как он взаимодействует с другими требованиями к этим же ресурсам другими приложениями и другими частями системы. Это ваш лучший шанс взять на себя управление оборудованием ввода и вывода, но не дает вам полного контроля, поскольку инфраструктура iOS имеет общий пользовательский интерфейс как самый высокий приоритет.
У вашего приложения есть один сеанс аудио, который вы можете инициализировать, активировать и деактивировать, а также получить и установить свойства. Поскольку ios6 большинство из этих свойств можно решить с помощью AVON-объекта AVFoundation singleton AVAudioSession, но для получения полного доступа вы все равно захотите использовать синтаксис функции Core Audio.
Чтобы установить режим аудио сеанса «Видеозапись» с помощью AVFoundation вы могли бы сделать что-то вроде этого:
- (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");
}
Такая же функциональность с помощью функции Core Audio (iOS5 и ниже). checkStatus - это функция обработки ошибок из вашего образца кода.
- (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);
}
Причины вы сказали, чтобы использовать режим видеозаписи, потому что это единственный способ, который даст вам надежду на непосредственно выбор заднего микрофона. Что это такое - выберите ближайший к видеокамере микрофон.
«На устройствах с более чем одним встроенным микрофоном используется микрофон, ближайший к видеокамере."(От AVSession Class Reference компании Apple)
Это говорит о том, что видео камера должна быть активны при использовании микрофона и выбор камеры спереди назад это параметр, который использует систему, чтобы выбрать подходящий микрофон. Возможно, видео-приложения, использующие задний микрофон (например, your example), фактически получают поток видеовхода с задней камеры и ничего не делают с ним. Я не могу проверить это, поскольку у меня нет доступа к iPhone 5. Я вижу, что приложение «Babyscope», о котором вы упомянули, имеет совершенно другое приложение для работы на ios5 по сравнению с ios4.
Ответ от Kuriakose вводит в заблуждение: AudioChannelLayout
является аудиодорожки, он не влияет на аудиооборудование, используемое при съемке. Ответ от Sangony просто показывает нам, что Apple действительно не хочет, чтобы мы имели полный контроль над оборудованием. Большая часть этого управления аудио на iOS - это попытка уберечь нас от прямого управления, чтобы соответствовать ожиданиям пользователей (поведения аудио-в/в между приложениями) и аппаратным ограничениям при работе с живыми сигналами.
У вас есть код, на который он не работает? – Abizern
@Abizem Я отредактировал свой ответ. –
Взгляните на это Apple Tech Примечание: http://developer.apple.com/library/mac/#technotes/tn2091/_index.html – sangony