使用 AVAudioPlayer 播放本地音频文件

Posted

技术标签:

【中文标题】使用 AVAudioPlayer 播放本地音频文件【英文标题】:Play local audio file with AVAudioPlayer 【发布时间】:2015-08-28 19:23:12 【问题描述】:

我正在模拟器中测试我的应用程序。

我正在下载文件并以本地方式获取它,如下所示: file:///Users/administrator/Library/Developer/CoreSimulator/Devices/4CDF286B-543F-4137-B5E2-C312E19B992F/data/Containers/Data/Application/E5F13797-A6A8-48A1-B3C3-FBC3D7A03151/Documents/4d13e04980d3.mp3

现在我想用 AVAudioPlayer 播放这个文件,但我总是收到这个错误:

file:///
Error Domain=NSOSStatusErrorDomain Code=2003334207 "(null)"

播放代码:

var alertSound = NSURL(fileURLWithPath: "file:///Users/administrator/Library/Developer/CoreSimulator/Devices/4CDF286B-543F-4137-B5E2-C312E19B992F/data/Containers/Data/Application/E5F13797-A6A8-48A1-B3C3-FBC3D7A03151/Documents/4d13e04980d3.mp3")
        print(alertSound)

        var error:NSError?
        do 
            try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
            audioPlayer.prepareToPlay()
            audioPlayer.play()
         catch 
            print(error)
        

我应该如何让它播放?

【问题讨论】:

你在下载和玩吗?我问是因为每次您在模拟器中运行您的应用程序时,您的应用程序文件夹都会有所不同。如果你想在你的app中播放一个声音,并且声音没有变化,那么获取MP3文件,在Xcode中添加到你的app中,使用NSBundle获取文件的URL。 不同的应用文件夹是对的,但音频可以更改,我需要立即下载并播放 【参考方案1】:

ios8 下,您保存的路径在启动时将无效。您看到的“E5F13797-A6A8-48A1-B3C3-FBC3D7A03151”的 ID 会随着每次启动而改变。

解决方案是保存文件名而不是完整路径,并通过获取 Documents(或 tmp)文件夹的路径并将文件名附加到它来重新创建 URL 或完整路径。

【讨论】:

是的,我看到 id 每次都变了。如果你能帮我写一些代码,我会非常感谢你,只需将文件保存到文档文件夹并在 avaudioplayer 中播放保存的文件 保存文件名,可能来自:url.absolutePath.lastPathComponent。当你想玩时,通过将 fieName 附加到 let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as! NSString 并使用 fileURLWithPath 来创建一个新 URL 我收到空文件错误,你能帮我提供完整的代码吗?:) 我不是用 Swift 写的,所以我不知道我的代码是否对你有帮助。 太棒了!这是从文档目录中获取下载文件的技巧!。这拯救了我的一天!【参考方案2】:

看看 NSFileManager。 URLForDirectory:inDomain:appropriateForURL:create:error: 方法是你应该使用的。

【讨论】:

【参考方案3】:
// create the soundFileURL for the word
        let toAppendString = "\(String)" //
        let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
        soundFileURL = documentsDirectory.URLByAppendingPathComponent(toAppendString)

    do 
    self.player = try AVAudioPlayer(contentsOfURL: soundFileURL)
        player.prepareToPlay()
        player.volume = 1.0
        player.play()

     catch let error as NSError 
        print(error)
    

【讨论】:

【参考方案4】:
            let fileName = ("FILE_NAME.mp3")
        let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
        let soundFileURL = documentsDirectory.URLByAppendingPathComponent(fileName)
        AudioCenter.player.playURL(soundFileURL)

【讨论】:

以上是关于使用 AVAudioPlayer 播放本地音频文件的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 AVAudioPlayer 播放存储在文档目录中的本地 mp3 文件

ios 如何播放在线的音频文件

OCiOS开发:音频播放器 AVAudioPlayer

iOS音频播放

AVAudioPlayer 本地音频设置补充篇:后台播放设置

来自服务器的 MP3 文件在 iOS7 中无法使用 AVAudioPlayer 播放