首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVAudioPlayerNode不播放声音

AVAudioPlayerNode不播放声音
EN

Stack Overflow用户
提问于 2018-12-27 21:12:52
回答 1查看 932关注 0票数 1

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

代码语言:javascript
复制
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 tutorial构建的一个单独的应用程序:https://www.raywenderlich.com/5154-avaudioengine-tutorial-for-ios-getting-started,它实际上显示了声音文件的长度和播放进度。一切似乎都很好,但即使这样,音频文件也不能正常播放。

是我的实现有问题,还是音频文件有问题?音频文件在itunes上播放正常。

EN

回答 1

Stack Overflow用户

发布于 2019-04-06 00:08:42

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

代码语言:javascript
复制
try AVAudioSession.sharedInstance().setCategory(.playAndRecord , mode: .default , options: .defaultToSpeaker)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53945686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档