路由音频输入以从iPhone上的顶部麦克风接收

路由音频输入以从iPhone上的顶部麦克风接收,iphone,ios,xcode4,avfoundation,Iphone,Ios,Xcode4,Avfoundation,我正在编写一个小应用程序来录制多首曲目,并相互播放。 我正在使用回放和录制模式,并将输出路由到主扬声器。 问题是底部的麦克风仍然被用于输入,所以现在我录制时,在新的曲目中,其他曲目的输出声音非常大。 以下是我到目前为止的情况: audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; OSStatus p

我正在编写一个小应用程序来录制多首曲目,并相互播放。 我正在使用回放和录制模式,并将输出路由到主扬声器。 问题是底部的麦克风仍然被用于输入,所以现在我录制时,在新的曲目中,其他曲目的输出声音非常大。 以下是我到目前为止的情况:

audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];    
OSStatus propertySetError = 0;
UInt32 allowMixing = true;
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing);

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);

[audioSession setActive:YES error:nil];

使用音频会话获取可用的输入。在我的iPhone5上看起来是这样的

NSLog(@"%@", [AVAudioSession sharedInstance].availableInputs);

  "<AVAudioSessionPortDescription: 0x14554400, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Back>"
NSLog(@"%@", [AVAudioSession sharedInstance].availableInputs[0].dataSources);

  "<AVAudioSessionDataSourceDescription: 0x145afb00, ID = 1835216945; name = Bottom>",
  "<AVAudioSessionDataSourceDescription: 0x145b1870, ID = 1835216946; name = Front>",
  "<AVAudioSessionDataSourceDescription: 0x145b3650, ID = 1835216947; name = Back>"

“顶部”麦克风是什么意思?iPhone底部有一个麦克风,内置扬声器。iPhone的顶部还有一个麦克风,在耳机插孔旁边有一个小小的整体。它用于消除噪音,也用于使用扬声器电话。请注意,由于dataSourceName是本地化的,因此上述解决方案仅适用于电话的语言环境为英语的情况。因此,所有可能值的比较都将失败。在iOS7上,您应该使用orientation属性(例如AVAudioSessionOrientationBack)。对于较旧的iOS版本,最好检查系统id值。
AVAudioSessionPortDescription *port = [AVAudioSession sharedInstance].availableInputs[0];
for (AVAudioSessionDataSourceDescription *source in port.dataSources) {
    if ([source.dataSourceName isEqualToString:@"Back"]) {
        [port setPreferredDataSource:source error:nil];
    }
}