使用iPhone 5的后置麦克风

我已经习惯以下代码stream从麦克风的audioinput/输出。 我想要做的是要select后方麦克风录音。 我已经读了设置kAudioSessionProperty_Mode到kAudioSessionMode_VideoRecording可以做的工作,但我不知道如何使用我的代码。 任何人都可以帮助我成功设置此参数。

我有这些行设置属性

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

但它不工作。

在苹果开发者图书馆点击这里

你可以看到一个特定的方法

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

您可以将AudioChannelDescription更改为2以使用辅助麦克风

我做了一些search和阅读。 最后结束在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]>" 

列表中只有一个麦克风出现。 所以要回答你的问题,这是不可能的(还)。

你的代码:

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

由于代码不正确而无法正常工作。 audio会话不是audio单元的属性。 audio会话通过硬件资源描述您的应用程序的一般行为,以及它如何与其他应用程序和系统其他部分对这些相同资源的其他需求进行合作。 这是控制input和输出硬件的最佳机会,但并不能完全控制,因为iOS框架将整体用户体验作为最重要的优先事项。

您的应用程序有一个audio会话,您可以初始化,激活和停用,并获取和设置属性。 由于ios6大多数这些属性都可以使用AVFoundation单例AVAudioSession对象来解决,但要获得完全访问权限,您仍然需要使用Core Audio函数语法。

要使用AVFoundation将audio会话模式设置为“VideoRecording”,您可以这样做:

  - (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"); } 

使用核心audiofunction(ios5及以下)的相同function。 checkStatus是代码示例中的error handling函数。

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

你被告知使用VideoRecording模式的原因是因为它是唯一的模式,会给你任何直接select后置麦克风的希望。 它所做的是select离摄像机最近的麦克风。

“在具有多个内置麦克风的设备上,使用距离摄像机最近的麦克风。” (来自Apple的AVSession类参考 )

这表明使用麦克风时摄像机必须处于活动状态,并且从前到后select摄像机是系统用来select合适的麦克风的参数。 这可能是使用后置麦克风的video免费应用程序(例如您的示例 )事实上是从后置摄像头获取videoinputstream,而不是对其进行任何操作。 我无法testing这个,因为我没有访问iPhone 5.我确实看到你提到的“Babyscope”应用程序有一个完全不同的应用程序在ios5与ios4上运行。

来自AudioChannelLayout的回答是误导性的: AudioChannelLayout是对audo轨道的描述 ,它对捕捉中使用的audio硬件没有影响。 Sangony的回答告诉我们,苹果公司并不希望我们完全控制硬件。 它在iOS上的大部分audiopipe理都是为了使我们远离直接控制,以便在处理现场信号时兼顾用户对于应用程序间audioI / O行为的期望和硬件限制。