swift - 使用 AVAudioPlayer swift 播放音频文件

标签 swift audio swift2 avaudioplayer

我首先下载音频消息,然后使用 Avaudioplayer 播放它

downloadTask = NSURLSession.sharedSession().downloadTaskWithURL(urlStr, completionHandler: { (URL, response, error) -> Void in

           self.play(URL!)


})
downloadTask

这工作正常,但如果我在保存我存储在 NSUserDefaults 中的响应 URL 后调用 play(URL) 方法。两种情况下的 URL 相同。我已经查过了。它是这样的:

file:///Users/mymac/Library/Developer/CoreSimulator/Devices/X-CD91-XXXXXXX-XXX-XXXXXX/data/Containers/Data/Application/XXXXXXX-XXXX-XXXXXXXXXX/tmp/CFNetworkDownload_InUTA3.tmp

将此文件 URL 传递至:

func play(url : NSURL) {

        do {
            player = try AVAudioPlayer(contentsOfURL: url)
            player.prepareToPlay()
            player.play()

        } catch let error as NSError {
            //self.player = nil
            print(error.localizedDescription)

        } catch {

            print("AVAudioPlayer init failed")
        }

    }

Url路径相同,但audioPlayer无法播放声音,显示以下错误:

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

有人可以在这方面指导我吗?

谢谢。

最佳答案

从上面的注释可以看出,问题是在完成 downloadTask 方法的 completionHandler 之前,下载的文件没有被移动。

正如 description 中所述location 参数

The location of a temporary file where the server’s response is stored. You must move this file or open it for reading before your completion handler returns. Otherwise, the file is deleted, and the data is lost.

因此,在 completionHandler 中,您必须在结束 completionHandler 之前将文件移动到您控制的另一个位置。

这可能也解释了崩溃的原因。如果“temp”URL 保存到 completionHandler 中的 UserDefaults,则当 completionHandler 完成时,该 URL 不再有效。所以当你稍后打电话时

play(URL!)

如果强制解包的 URL 现在无效,则会发生崩溃。

因此,作为额外的安全措施,请在尝试使用 URL 之前尝试对其进行解包:

if let url = urlFromUserDefaults {
    play(url)
}

希望对您有帮助。

关于swift - 使用 AVAudioPlayer swift 播放音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40627382/

相关文章:

android - 简单的kivy应用程序按下按钮无法在Android设备上播放mp3

ios - UIWebView LoadData 不接受 textEncodingName 和 baseURL 的 Nil 值

ios - Int转String时不显示[Swift]

ios - UITextView 左侧图像图标 swift

c# - 如何播放要在设定的延迟下重复播放的音频片段阵列?

iphone - 在运行 iOS4 的 3G iPhone 上设置本地通知声音

ios - SwiftUI 中的 Admob 原生广告

ios - alamofire的两种请求方式有什么区别?

arrays - Swift 上的 JSON : Array to String/TextField Text

ios - 根据字母数量动态创建 UIView