【发布时间】:2017-03-30 08:54:16
【问题描述】:
我先下载音频信息,然后使用 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
将此文件网址传递给:
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无法播放声音,提示如下错误:
操作无法完成。 (OSStatus 错误 2003334207。)
任何人都可以在这方面指导我吗?
谢谢。
【问题讨论】:
-
所以......只是为了理解你正确。如果您使用存储在 UserDefaults 中的 URL 调用
play...它有效吗?如果您在downloadTaskWithURL的完成处理程序中直接调用它,它不起作用......对吗?还是反过来? -
您需要以适当的文件扩展名存储它。 .tmp 永远无法播放,如果您知道文件的类型,请将其重命名为正确的名称。然后播放。
-
-
啊,好的,谢谢 :) 在退出
completionHandler之前,您必须将文件移动到其他位置。正如这里所说的location:developer.apple.com/reference/foundation/nsurlsession/…“存储服务器响应的临时文件的位置。您必须在完成处理程序返回之前移动此文件或打开它以进行读取。否则,该文件将被删除,并且数据丢失了。”,所以如果你还没有这样做,那么这可能就是它在completionHandler中工作的原因,而不是以后。 -
这也解释了你崩溃的原因,你只需传递一个力解开
URL并且由于在那个位置不再有你保存在 UserDefaults 中的项目,它会崩溃
标签: swift audio swift2 avaudioplayer