【问题标题】:AVAudioPlayer is no playing anythingAVAudioPlayer 没有播放任何东西
【发布时间】:2019-04-19 16:08:05
【问题描述】:

我有一个 tableViewCell,我想在里面播放一个通常是 .m4a 的声音。 我已经像这样在全球范围内声明了我的 AVAudioPlayer 实例:

var player = AVAudioPlayer()

然后我下载我的声音,把它放在 Documents 的一个目录中。但是,当我尝试从目录播放我的声音文件时,我收到了这个错误:

Open failed
The operation couldn’t be completed. (OSStatus error 2003334207.)

这是我的代码我不知道你有什么问题。我在模拟器中找到了可以用 QuickTimePlayer 播放的文件。

func downloadSound(_ message: ChatVoiceMessageStructure) {
    guard let url = service?.networkManager.CDNURL else { return }
    let doanloadURL = URL(string: url.appending(message.name!))
    let docUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
    let desURL = docUrl.appendingPathComponent("tmpsong.m4a")
    var downloadTask:URLSessionDownloadTask
    let request = URLRequest(url: doanloadURL!)
    downloadTask = URLSession.shared.downloadTask(with: request, completionHandler: { [weak self](URLData, response, error) -> Void in
        do{
            let isFileFound:Bool? = FileManager.default.fileExists(atPath: desURL.path)
            if isFileFound == true{
                print(desURL) //delete tmpsong.m4a & copy
            } else {
                try FileManager.default.copyItem(at: URLData!, to: desURL)
            }
            let sPlayer = try AVAudioPlayer(contentsOf: desURL)
            self?.player = sPlayer
            self?.player.prepareToPlay()
            self?.player.play()

        } catch let err {
            print(err.localizedDescription)
        }

    })
    downloadTask.resume()

}

【问题讨论】:

    标签: swift url avfoundation avaudioplayer document-directory


    【解决方案1】:

    感谢 MAhipal,我终于找到了问题所在。问题是 AVAudioPlayer 无法播放某种音频格式。就像音频扩展名是 MPEG4 但音频编码不是 AAC 时一样。所以要注意 AVAudioPlayer 支持的格式。你可以在CoreAudio 类,AudioFormatID 的子类中找到这些。这花了我几周的时间来解决希望它可以节省其他一些时间。 如果你想玩其他类型可以使用AVPlayer

    这些是供将来参考的类型:

    public var kAudioFormatLinearPCM: AudioFormatID { get }
    public var kAudioFormatAC3: AudioFormatID { get }
    public var kAudioFormat60958AC3: AudioFormatID { get }
    public var kAudioFormatAppleIMA4: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC: AudioFormatID { get }
    public var kAudioFormatMPEG4CELP: AudioFormatID { get }
    public var kAudioFormatMPEG4HVXC: AudioFormatID { get }
    public var kAudioFormatMPEG4TwinVQ: AudioFormatID { get }
    public var kAudioFormatMACE3: AudioFormatID { get }
    public var kAudioFormatMACE6: AudioFormatID { get }
    public var kAudioFormatULaw: AudioFormatID { get }
    public var kAudioFormatALaw: AudioFormatID { get }
    public var kAudioFormatQDesign: AudioFormatID { get }
    public var kAudioFormatQDesign2: AudioFormatID { get }
    public var kAudioFormatQUALCOMM: AudioFormatID { get }
    public var kAudioFormatMPEGLayer1: AudioFormatID { get }
    public var kAudioFormatMPEGLayer2: AudioFormatID { get }
    public var kAudioFormatMPEGLayer3: AudioFormatID { get }
    public var kAudioFormatTimeCode: AudioFormatID { get }
    public var kAudioFormatMIDIStream: AudioFormatID { get }
    public var kAudioFormatParameterValueStream: AudioFormatID { get }
    public var kAudioFormatAppleLossless: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC_HE: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC_LD: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC_ELD: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC_ELD_SBR: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC_ELD_V2: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC_HE_V2: AudioFormatID { get }
    public var kAudioFormatMPEG4AAC_Spatial: AudioFormatID { get }
    public var kAudioFormatAMR: AudioFormatID { get }
    public var kAudioFormatAMR_WB: AudioFormatID { get }
    public var kAudioFormatAudible: AudioFormatID { get }
    public var kAudioFormatiLBC: AudioFormatID { get }
    public var kAudioFormatDVIIntelIMA: AudioFormatID { get }
    public var kAudioFormatMicrosoftGSM: AudioFormatID { get }
    public var kAudioFormatAES3: AudioFormatID { get }
    public var kAudioFormatEnhancedAC3: AudioFormatID { get }
    public var kAudioFormatFLAC: AudioFormatID { get }
    public var kAudioFormatOpus: AudioFormatID { get }
    

    【讨论】:

      【解决方案2】:

      请在真实设备上运行并在URLSession块中添加DispatchQueue.main.async

      在这里,我尝试了您的代码,稍作改动,并在真实设备上运行...

      var audioPlayer:AVAudioPlayer!
          func downloadSound() {
              let doanloadURL = URL(string: "https://github.com/robovm/apple-ios-samples/raw/master/avTouch/sample.m4a")!
              let docUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
              let desURL = docUrl.appendingPathComponent("sample.m4a")
              var downloadTask:URLSessionDownloadTask
              let request = URLRequest(url: doanloadURL)
              downloadTask = URLSession.shared.downloadTask(with: request, completionHandler: { (URLData, response, error) -> Void in
                  DispatchQueue.main.async {
                      do{
                          let isFileFound:Bool? = FileManager.default.fileExists(atPath: desURL.path)
                          if isFileFound == true{
                              print(desURL) //delete tmpsong.m4a & copy
                          } else {
                              try FileManager.default.copyItem(at: URLData!, to: desURL)
                          }
                           let sPlayer = try AVAudioPlayer(contentsOf: desURL)
                          try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
                          try AVAudioSession.sharedInstance().setActive(true)
                          self.audioPlayer = sPlayer
                          self.audioPlayer.prepareToPlay()
                          self.audioPlayer.play()
                        } catch let err {
                          print(err.localizedDescription)
                      }
                  }
               })
              downloadTask.resume()
           }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2011-12-22
      • 2021-01-16
      • 2021-10-29
      相关资源
      最近更新 更多