Не удается воспроизвести аудиофайл amr в iOS

Попытка воспроизвести аудиофайл AMR с помощью этого кода:

    var player: AVAudioPlayer? = nil
    WebService.shared.download(self.dataSource.object(at: indexPath)) { data in
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)

            player = try AVAudioPlayer(data: data, fileTypeHint: AVFileType.amr.rawValue)
            guard let player = player else { return }

            print("Going to play: \(player.duration) seconds...")
            player.volume = 1.0
            player.prepareToPlay()
            player.play()
        } catch {
            print(error.localizedDescription)
        }
    }

Я абсолютно уверен, что:

  1. полученные данные не равны нулю
  2. Я вижу правильное время продолжительности файла amr
  3. amr файлы содержат несколько голосов
  4. у меня не вылезло ни одной ошибки
  5. я ничего не слышал

Что случилось и как это исправить?


person zzheads    schedule 04.10.2017    source источник


Ответы (1)


Проблема с

guard let player = player else { return }

Вы заменяете внешний необязательный AVAudioPlayer необязательной локальной копией. Вы вызываете play() для локальной копии, а затем, когда закрытие завершается, она выходит за рамки и удаляется.

Попробуй это.

    player = try AVAudioPlayer(data: data, fileTypeHint: AVFileType.amr.rawValue)
    player?.volume = 1.0
    player?.prepareToPlay()
    player?.play()
} catch {
person Price Ringo    schedule 04.10.2017
comment
Но что за проблема? Я использую плеер только внутри закрытия - person zzheads; 04.10.2017
comment
Заменено на: let player = try AVAudioPlayer(data: data, fileTypeHint: AVFileType.amr.rawValue) print(Идет воспроизведение: (player.duration) секунд...) player.volume = 1.0 player.prepareToPlay() player.play () . Тот же результат - person zzheads; 04.10.2017
comment
Это не сработает. Удалите let перед let player = AV... Не создавайте локальную переменную. Используйте переменную player, объявленную над вашим веб-сервисом. - person Price Ringo; 04.10.2017
comment
Это было решение половины проблемы. Теперь я могу воспроизводить аудио .wav, .mp3, .ac и т. д., но не .amr. - person zzheads; 07.10.2017