使用 AVAudioPlayer 播放音频文件 swift

Play audio file using AVAudioPlayer swift

我先下载语音信息然后用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之前没有被移动。

location参数description中所述

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)
}

希望对你有所帮助。

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

 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)
        }