1

AudioPlayerNode是一个实例变量代码如下:

class HXAudioEngine {
   private var audioEngine: AVAudioEngine = AVAudioEngine()

   var digitFileUrl: URL? {
      didSet {
          if let digitUrl = digitFileUrl {
              do {
                  digitAudioFile = try AVAudioFile(forReading: digitUrl)
              } catch let error {
                print("Error loading Digit file: \(error.localizedDescription)")
            }
          }
      }
   }
   var digitAudioFile: AVAudioFile? {
      didSet {
          if let digitFile = digitAudioFile {
              digitAudioFormat = digitFile.processingFormat
              digitFileBuffer = AVAudioPCMBuffer(pcmFormat: digitFile.processingFormat, frameCapacity: UInt32(digitFile.length))
          }
      }
   }
   var digitFileBuffer: AVAudioPCMBuffer? {
      didSet {
          if let buffer = digitFileBuffer {
              do {
                  try digitAudioFile?.read(into: buffer)
              } catch let error {
                  print("Error loading digit file into buffer: \(error.localizedDescription)")
              }
          }
      }
  }
  var digitAudioFormat: AVAudioFormat?
  var digitPlayer: AVAudioPlayerNode = AVAudioPlayerNode()

  func playDigit() {
      let file = "d0p1m00db"
      digitFileUrl = Bundle.main.url(forResource: file, withExtension: "wav")
      audioEngine.attach(digitPlayer)
      audioEngine.connect(digitPlayer, to: audioEngine.mainMixerNode, format: digitAudioFormat)
      audioEngine.prepare()

      do {
           try audioEngine.start()
      } catch let error {
           print(error)
      }

      guard let digitBuffer = digitFileBuffer else { return }
      guard let digitAudioFile = digitAudioFile else { return }

      digitPlayer.scheduleBuffer(digitBuffer, at: nil, options: .interrupts) {
             print("Done playing digit")
      }
      digitPlayer.play()
   }
}

由于某种原因,最终播放的文件只是一个点击声。音频文件是一个 1 秒长的文件,由一位女士说话。

似乎播放器通过声音文件加速,因此模糊了语音。采样率为 44100。在 Stack Overflow 上阅读有很多解决方案都在谈论在声音文件完成之前释放音频播放器。

但是我已经在通过 Raywenderlich 教程构建的单独应用程序上进行了测试:https ://www.raywenderlich.com/5154-avaudioengine-tutorial-for-ios-getting-started ,它实际上显示了声音文件的长度和播放进度. 一切似乎都很好,但即便如此,音频文件也无法正常播放。

我的实现有问题还是音频文件有问题?音频文件在 iTunes 上播放良好。

4

1 回答 1

0

如果您需要输出设备进行播放,耳机或其他类型的选择必须设置音频会话类别。

try AVAudioSession.sharedInstance().setCategory(.playAndRecord , mode: .default , options: .defaultToSpeaker)
于 2019-04-05T16:08:42.313 回答