【问题标题】:Using only the top mic in an iPhone仅使用 iPhone 的顶部麦克风
【发布时间】:2013-01-15 09:37:41
【问题描述】:

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

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

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

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

UInt32 yes = YES;

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

iPhone 上的麦克风有什么类似的吗?

谢谢。

【问题讨论】:

标签: iphone ios audio


【解决方案1】:

使用 AVAudioSession 获取可用的输入。

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

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

希望对你有帮助 快乐编码!!!

【讨论】:

    【解决方案2】:

    swift 4 我的 2 美分:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多