使用 AVAudioPlayer 播放音频

Posted

技术标签:

【中文标题】使用 AVAudioPlayer 播放音频【英文标题】:Playing audio with AVAudioPlayer 【发布时间】:2020-03-21 17:49:00 【问题描述】:

我目前正在从 Firebase 下载音频文件,并将它们保存在本地并在表格视图中列出。我得到这样的本地目录:

file:///var/mobile/Containers/Data/Application/6C72433F-4DF0-4976-BBDE-36F6B5C23E6D/Documents/nJNJwVNMrmUGj9uszManQmMOZf52_NO:1.m4a

当我尝试使用 AVAudioPLayer 播放音频文件时出现错误:

错误域=NSOSStatusErrorDomain 代码=2003334207 "(null)"

我已经坚持了三天,非常感谢有人指出我正确的方向。如果需要任何进一步的代码来帮助解决这个问题,请告诉我。谢谢。

这是我播放音频的代码:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    //Access the cell tapped on and the path to the recording the user wants to listen to
    let path = findDirectory(filename:userID + "_NO:" + String(recordingNumber)).appendingPathComponent("\(indexPath.row + 1).m4a")

    do 
        self.audioPlayer = try AVAudioPlayer(contentsOf: path)
        self.audioPlayer.play()
     catch let error as NSError 
        print(error.description)
    

我查找目录的代码在这里:

func findDirectory(filename:String) -> URL 
    let fileManager = FileManager.default
    let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
    let docDirectory = urls[0] as URL
    let soundURL = docDirectory.appendingPathComponent("\(filename).m4a")
    print(soundURL)
    return soundURL

【问题讨论】:

【参考方案1】:

如果您下载的文件保存为nJNJwVNMrmUGj9uszManQmMOZf52_NO:1.m4a,您为什么要在其顶部附加:.appendingPathComponent("\(indexPath.row + 1).m4a") 这个值<row_value + 1>.m4a 在您的tableview 中?

就像现在您正在尝试查找保存为:nJNJwVNMrmUGj9uszManQmMOZf52_NO:1.m4a<row_value + 1>.m4a 的文件。

这里<row_value + 1> 是我在此答案中使用的占位符,以向您展示其含义,但在实际代码中将替换为12、...等值。

为了更好地解释,让我们分析一下:

let path = findDirectory(filename:userID + "_NO:" + String(recordingNumber)).appendingPathComponent("\(indexPath.row + 1).m4a")
    userID + "_NO:" 会产生类似:nJNJwVNMrmUGj9uszManQmMOZf52_NO:
    String(recordingNumber) 将产生类似:1(例如)
    并使用上述方法执行findDirectory(filename: ...) 将在let soundURL = docDirectory.appendingPathComponent("\(filename).m4a") 行返回nJNJwVNMrmUGj9uszManQmMOZf52_NO:1.m4a
    现在除此之外,您还可以使用 .appendingPathComponent("\(indexPath.row + 1).m4a") 将更多内容附加到您看起来已经完成的路径中

您可能希望修改逻辑以更好地匹配您期望路径与 tableview 一起使用的方式,以便为您的文件编写正确的路径(也许这意味着在您的情况下删除您在第 4 步)

【讨论】:

取出 .appendingPathComponent("(indexPath.row + 1).m4a") 解决了我的问题!谢谢

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

使用 AVAudioPlayer 播放音频时出错

AVAudioPlayer 15 次不播放音频

使用 AVAudioPlayer 播放多个音频文件

使用 AVAudioPlayer 播放声音后恢复背景音频

AVAudioPlayer 无法播放使用 ExtAudioFileWriteAsync 编写的音频 (.wav) 文件

iPhone SDK:如何使用 AVAudioPlayer 标准化音频播放?