【问题标题】:AVAudioPlayerNode does not play soundAVAudioPlayerNode 不播放声音
【发布时间】:2018-12-27 13:12:52
【问题描述】:

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 上播放良好。

【问题讨论】:

  • 有趣的是,如果输出是设备扬声器,音频文件无法正常播放,但如果插入耳机,音频文件将正常播放。有谁知道为什么会这样?
  • 会不会是你的手机处于静音模式?

标签: swift audio avaudioengine avaudioplayernode


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2021-09-14
    • 2015-03-20
    • 2011-02-25
    相关资源
    最近更新 更多