【问题标题】:Can not play amr audio file in iOS无法在 iOS 中播放 amr 音频文件
【发布时间】:2017-10-04 15:30:30
【问题描述】:

尝试使用此代码播放 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. 我什么都没听到

发生了什么事以及如何解决?

【问题讨论】:

    标签: ios swift avaudioplayer amr


    【解决方案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 {
    

    【讨论】:

    • 但是有什么问题?我只在封闭内使用播放器
    • 替换为:let player = try AVAudioPlayer(data: data, fileTypeHint: AVFileType.amr.rawValue) print("Going to play: (player.duration) seconds ...") player.volume = 1.0 player.prepareToPlay() player.play() 。结果相同
    • 那行不通。去掉 let player = AV 前面的 let... 不要创建局部变量。使用在您的网络服务上方声明的播放器变量。
    • 这是一个半问题的决定。现在我可以播放 .wav、.mp3、.ac 等音频,但不能播放 .amr。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多