2

私の知る限り、iPhoneには2つのマイクがあります。1 つは上部のオーディオ ジャックの横にあり、もう 1 つは話すマイクです。デフォルトのマイクは、あなたが話しているマイクのようです。

使用するマイクをプログラムでどのように選択しますか? アプリに Core Audio を使用しています。

基本的にはトップマイクで録音したい。現在、私が録音するときは、下のマイクが使用されています。デフォルトのマイク設定を上書きする方法はありますか?

次の方法でデフォルトのスピーカー設定を上書きできることを知っています。

UInt32 yes = YES;

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

iPhoneのマイクに似たものはありますか?

ありがとう。

4

2 に答える 2

4

AVAudioSession を使用して、利用可能な入力を取得します。

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

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

次に、これらの入力の 1 つを使用して、次のように 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 には実際に 3 つのマイクがあることがわかります: 上部前面、上部背面、下部です。これで、好みのデータ ソースを設定できます。

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

これが幸せなコーディングに役立つことを願っています!!!

于 2015-06-27T06:50:27.713 に答える
4

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")
                    }
                }
            }
        }
    }
于 2017-11-15T07:08:45.507 に答える