AVAudioPlayerNode不播放声音

时间:2018-12-27 13:12:52

标签: swift audio avaudioengine avaudioplayernode

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位数字的1秒长文件。

播放器似乎加快了声音文件的速度,因此掩盖了语音。采样率为44100。阅读堆栈溢出时,有很多解决方案都在讨论在完成声音文件之前将音频播放器释放的方法。

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

我的实现是否存在问题,或者是音频文件?音频文件在iTunes上可以正常播放。

1 个答案:

答案 0 :(得分:0)

如果需要用于播放的输出设备,则必须将耳机或其他类型的选择设置为音频会话类别。

try AVAudioSession.sharedInstance().setCategory(.playAndRecord , mode: .default , options: .defaultToSpeaker)