2013-06-19 66 views
9

我已经习惯了跟随code流来自麦克风的音频I/O。我想要做的是想选择后置麦克风进行录制。我已经阅读设置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技术说明:http://developer.apple.com/library/mac/#technotes/tn2091/_index.html – sangony

回答

6
在苹果开发者库

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个麦克风,但这并不是说你可以控制现在使用哪一个。当录制视频或扬声器电话被激活时,顶部麦克风似乎被使用。底部麦克风用于电话呼叫,仅限音频录音和噪音消除过滤。从我能收集到的信息来看,苹果公司现在想要自己做的事情是如何使用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); 

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

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

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

    } 

同样的功能:

要设置使用AVFoundation,你会做这样的事情音频会话模式“录像”。 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

这表明,摄像机需要使用麦克风时要活跃,从前到后摄像头的选择是系统用来选择合适的麦克风参数。这可能是因为使用后置麦克风的视频免费应用(如your example)实际上是从后置摄像头获得视频输入流,而没有对其进行任何操作。我无法测试此功能,因为我无法访问iPhone 5.我确实看到你提到的“Babyscope”应用程序有一个完全不同的应用程序,用于在ios5上运行,而不是在ios4上。

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