【问题标题】:Play audio file using AVAudioPlayer swift使用 AVAudioPlayer swift 播放音频文件
【发布时间】: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 之前,您必须将文件移动到其他位置。正如这里所说的locationdeveloper.apple.com/reference/foundation/nsurlsession/…“存储服务器响应的临时文件的位置。您必须在完成处理程序返回之前移动此文件或打开它以进行读取。否则,该文件将被删除,并且数据丢失了。”,所以如果你还没有这样做,那么这可能就是它在completionHandler 中工作的原因,而不是以后。
  • 这也解释了你崩溃的原因,你只需传递一个力解开 URL 并且由于在那个位置不再有你保存在 UserDefaults 中的项目,它会崩溃

标签: swift audio swift2 avaudioplayer


【解决方案1】:

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

正如它在location 参数的description 中所说的那样

存储服务器响应的临时文件的位置。您必须在完成处理程序返回之前移动此文件或打开它以供阅读。否则,文件被删除,数据丢失。

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

这可能也解释了崩溃。如果“临时”URL 保存到 completionHandler 中的 UserDefaults,那么当 completionHandler 完成时,该 URL 将不再有效。因此,当您稍后调用时

play(URL!)

强制解包 URL 现在无效,您会遇到崩溃。

因此,作为一项额外的安全措施,请在尝试使用之前尝试解开 URL:

if let url = urlFromUserDefaults {
    play(url)
}

希望对你有所帮助。

【讨论】:

  • 谢谢它的工作。现在我已经在完成处理程序的文档目录中移动了文件并访问了路径。谢谢
  • 不客气,很高兴你最终成功了 :)
【解决方案2】:

你可以简单地写这个......

 do
        {
            self.player = try AVAudioPlayer(contentsOf:Url)
            self.player?.numberOfLoops = 0
            self.player?.prepareToPlay()
            self.player?.volume = 1.0
            self.player?.play()
            self.player?.delegate=self
        }
        catch let error as NSError
        {
            print(error)
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多