仅使用iPhone中的顶级麦克风

时间:2013-01-15 09:37:42

标签: iphone ios audio

据我所知,iPhone上有2个麦克风。 1靠近音频插孔旁边的顶部,另一个是你说话的麦克风。 默认麦克风似乎是你说的那个。

如何以编程方式选择使用哪个麦克风?我正在为我的应用程序使用Core Audio。

基本上我想用顶级麦克风录音。目前,当我录制底部麦克风正在使用。有没有办法覆盖默认的麦克风设置?

我知道可以通过以下方式覆盖默认扬声器设置。

UInt32 yes = YES;

AudioSessionSetProperty( kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,        sizeof(UInt32),   &yes );

iPhone上的麦克风类似吗?

感谢。

2 个答案:

答案 0 :(得分:3)

使用AVAudioSession获取可用输入。

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

"<AVAudioSessionPortDescription: 0x14554400, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Back>"

然后使用其中一个输入来获取availableDataSources,就像这样。

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上实际上有三个麦克风:顶部正面,顶部背面和底部。现在,您可以设置首选数据源。

AVAudioSessionPortDescription *port = [AVAudioSession sharedInstance].availableInputs[0];
for (AVAudioSessionDataSourceDescription *source in port.dataSources) {
    if ([source.dataSourceName isEqualToString:@"Back"]) {
        [port setPreferredDataSource:source error:nil];
    }
}     

希望这会对你有所帮助 快乐的编码!!!

答案 1 :(得分:2)

我的2美分快速4:

class func test3Mics(){

        guard let inputs = AVAudioSession.sharedInstance().availableInputs else{
            return
        }
        print(inputs.debugDescription)

        for input in inputs{
            print(input.dataSources ?? "??")
        }

        // set preferred:
        let preferredPort = inputs[0]
        if let dataSources = preferredPort.dataSources{
        for source in dataSources {
                if source.dataSourceName=="Back" {
                    do {
                        try preferredPort.setPreferredDataSource(source)
                    }catch _ {
                            print("cannot set frontDataSource")
                    }
                }
            }
        }
    }