2013-06-19 3 views
9

Я использовал для следования code поток аудио/аудио звука из микрофона. Я хочу, чтобы выбрать задний микрофон для записи. Я прочитал, что настройка kAudioSessionProperty_Mode на kAudioSessionMode_VideoRecording может выполнять эту работу, но я не уверен, как ее использовать с моим кодом. Может ли кто-нибудь помочь мне в успешной установке этого параметра.использовать задний микрофон iphone 5

У меня есть эти строки для установки свойства

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

но не работает.

+1

У вас есть код, на который он не работает? – Abizern

+0

@Abizem Я отредактировал свой ответ. –

+0

Взгляните на это Apple Tech Примечание: http://developer.apple.com/library/mac/#technotes/tn2091/_index.html – sangony

ответ

6

в библиотеке для разработчиков Apple click here

вы можете увидеть конкретный метод

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

вы можете изменить AudioChannelDescription 2 для использования вторичного микрофона

+1

Ваш ответ указывает на использование обоих микрофонов одновременно. Вопрос в том, как использовать только задний микрофон. Или я ошибаюсь? – sangony

+0

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

5

Я сделал поиск и чтение. Наконец, в Справочнике классов AVCaptureDevice. Ключевая команда здесь для вас - NSLog(@"%@", [AVCaptureDevice devices]);. Я запустил это с прикрепленным iPhone и получил следующее:

"<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]>" 

Только один микрофон когда-либо появляется в списке. Поэтому, чтобы ответить на ваш вопрос, это не может быть сделано (пока).

+0

но есть приложения на appstore, которые захватываются с заднего микрофона. –

+0

Не знаю, что вам сказать. Это правда, у iPhone есть 2 микрофона, но это не означает, что вы можете контролировать, какой из них можно использовать прямо сейчас. Похоже, что верхний микрофон используется при записи видео или при активации динамика. Нижний микрофон используется для телефонных звонков, аудиозаписей и фильтрации шумоподавления. Из того, что я могу собрать, Apple хочет сделать свое дело сейчас о том, как используются 2 микрофона и когда. Взгляните на эту ссылку http://www.iphoneincanada.ca/how-to/how-to-use-your-iphone-44s-microphones-properly/ – sangony

3

Ваш код:

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 - это попытка уберечь нас от прямого управления, чтобы соответствовать ожиданиям пользователей (поведения аудио-в/в между приложениями) и аппаратным ограничениям при работе с живыми сигналами.