我有一个应用程序可以点击麦克风,还可以根据麦克风输入播放声音(不必同时通过tho)。下面的代码有效。但是一个问题是输出在小型顶部扬声器而不是底部真实扬声器上播放。我可以通过在播放器开始播放之前将3行放在下面来奇怪地解决此问题,然后我可以听到扬声器上的声音。但随后麦克风停止收听!即使在播放器停止播放之后。基本上麦克风不喜欢
.defaultToSpeaker
任何的想法?
这里也记录了我想做的是正确的:
更新: 我最小化了问题。没有球员只是麦克风。下面的代码是“ .defaultToSpeaker”时,mic无法“工作”。经过一些调试后,我意识到defaultToSpeaker将麦克风从“底部”切换到“前部”。和
Run Code Online (Sandbox Code Playgroud)try preferredPort.setPreferredDataSource(source)
似乎无法再次将其更改为底部。(我可以为此提供代码)并且当category为defaultToSpeaker时,tap缓冲区的帧长显然是4800而不是4410。这种差异似乎在我的代码中造成了麻烦,因为我需要44100。所以mic实际上正在工作,但是稍后在代码中失败了由于SR不同而无法胜任。下面的代码可以解释更多。
func tapMicrophone() {
try? AVAudioSession.sharedInstance().setActive(false)
try? AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker])
//setBottomMic()
try? AVAudioSession.sharedInstance().setActive(true)
//tracker.start()
let input = engine.inputNode
let inputFormat = input.outputFormat(forBus: 0)
let sampleRate = Double(11025)
let outputFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: sampleRate, channels: 1, interleaved: true)!
let converter = AVAudioConverter(from: inputFormat, to: outputFormat)!
let inputBufferSize = 44100 // 100ms of 44.1K = 4410 samples.
let sampleRateRatio = 44100 / sampleRate
input.installTap(onBus: 0, bufferSize: AVAudioFrameCount(inputBufferSize), …Run Code Online (Sandbox Code Playgroud)