使用内置麦克风的 ios 录音只有一个 channel 声音

标签 ios swift audio audio-recording avaudioengine

我正在使用 AVAudioEngine 来捕捉用户的声音并对其应用一些效果。当使用耳机的麦克风录音时,一切顺利。但是用手机内置麦克风录音,通过耳机播放声音时,只有左侧耳塞有声音,看来内置麦克风只有单声道输入。那么我该如何解决这个问题呢?这是我的一些代码:

func connectNode(){
  engine.connect(engine.inputNode!, to: reverbNode, format:reverbNode.outputFormatForBus(0))
  engine.connect(reverbNode, to: delayNode, format: delayNode.outputFormatForBus(0))
  engine.connect(delayNode, to: distortion, format: distortion.outputFormatForBus(0))
  engine.connect(distortion, to: engine.mainMixerNode, format: engine.mainMixerNode.outputFormatForBus(0))
  engine.connect(player, to: engine.mainMixerNode, format: engine.mainMixerNode.outputFormatForBus(0))
}

func recordToFile(){
  setSessionRecord()
  recordSetting[AVFormatIDKey] = NSNumber(unsignedInt: UInt32(kAudioFormatMPEG4AAC))
  recordSetting[AVNumberOfChannelsKey] = NSNumber(int: 2)
  var file: AVAudioFile!
  do{
    try file = AVAudioFile(forWriting: URLFor(fileName)!, settings: recordSetting)
  }catch let error as NSError{
  print("error:\(error)")
  }
  engine.mainMixerNode.installTapOnBus(0, bufferSize: 1024, format: file.processingFormat) { (buffer, time) -> Void in
  try! file.writeFromBuffer(buffer)
  }
}

func playbackRecord(){
  setSessionPlayback()
  var file:AVAudioFile!
  file = try! AVAudioFile(forReading:URLFor(fileName)!)
  let audioFormat = file.processingFormat
  let audioFrameCount = UInt32(file.length)
  let audioFileBuffer = AVAudioPCMBuffer(PCMFormat: audioFormat, frameCapacity: audioFrameCount)
  try! file.readIntoBuffer(audioFileBuffer, frameCount: audioFrameCount)
  player.scheduleBuffer(audioFileBuffer, atTime: nil, options: .Interrupts, completionHandler: {print(self.player.stop())})
  if(!player.playing){
    player.play()
  }else{
    print("stop")
    player.stop()
  } 
}

最佳答案

我找到了解决这个问题的方法。只要修改这个方法,给引擎一个单一的 channel 格式,然后一切都会好起来的。

func connectNode(){
  let format = AVAudioFormat(commonFormat: AVAudioCommonFormat.PCMFormatFloat32, sampleRate: 44100.0, channels:AVAudioChannelCount(1), interleaved: false)
  engine.connect(engine.inputNode!, to: reverbNode, format:format)
  engine.connect(reverbNode, to: delayNode, format: format)
  engine.connect(delayNode, to: distortion, format: format)
  engine.connect(distortion, to: engine.mainMixerNode, format: format)
  engine.connect(player, to: engine.mainMixerNode, format: engine.mainMixerNode.outputFormatForBus(0))
}

关于使用内置麦克风的 ios 录音只有一个 channel 声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36794066/

相关文章:

ios - 检测 View 何时被(重新)显示

ios - 更改 Alamofire.SessionManager 的 serverTrustPolicy 以仍然使用像 Alamofire.request 这样的顶级便捷方法

swift - 如何使用 ObjectMapper 将枚举的 rawValue 分配给变量?

ios - NSDecimalNumber notANumber 对于字母 'E' 不正确

objective-c - 构建具有多个可拉伸(stretch)图像的 UIImage

objective-c - 如何覆盖点到像素 iOS 特异性并以正确的尺寸绘制图像?

Python :Wave. 将帧读取到 numpy 数组以获取 fft

audio - 如何将同一文件夹中的所有音频文件同时转换为另一种格式

c# - 在 Internet Explorer 8 和 9 中播放非 pcm (gsm) ".wav"-文件

ios - AVFoundation中,如何同步录制和播放