AVAudioPlayerNode не воспроизводит звук - PullRequest
0 голосов
/ 27 декабря 2018

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. При чтении переполнения стека существует множество решений, говорящих об освобождении аудиоплеера до завершения звукового файла.

Но я протестировал отдельное приложение, созданное с помощью учебника Raywenderlich: https://www.raywenderlich.com/5154-avaudioengine-tutorial-for-ios-getting-started,, которое фактически показывает длину звукового файла и ход воспроизведения.И все выглядит хорошо, но даже тогда аудиофайл не воспроизводится должным образом.

Есть ли проблема с моей реализацией или это аудиофайл?Аудиофайл хорошо воспроизводится на itunes.

1 Ответ

0 голосов
/ 05 апреля 2019

, если вам нужно устройство вывода для воспроизведения, для наушников или другого вида выбора должна быть установлена ​​категория аудиосессии.

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