AVAudioPlayer不从网站播放m4a或mp3文件类型

时间:2018-03-20 18:23:37

标签: ios swift url audio avaudioplayer

我正在尝试使用我的应用程序找到一个只有纯.m4a声音的网址。我有音频的URL,理论上下载它。然后,通过下载的fileURL到声音,我尝试用AVAudioPlayer播放它,但它不播放任何声音。这是我的代码:

在URL检索功能中,我调用:(网址定义为URL(string: url),url是检索网址字符串)

downloadSound(url: urls!)

这是我的downloadSound()函数:

func downloadSound(url:URL){

    var downloadTask:URLSessionDownloadTask
    downloadTask = URLSession.shared.downloadTask(with: url, completionHandler: { [weak self](URL, response, error) -> Void in
        self?.playSound(url: URL!)
    })
    downloadTask.resume()
}

最后是playSound功能:

func playSound(url:URL) {
    print("The url is \(url)")
    let player = try! AVAudioPlayer(contentsOf: url)
    player.play()

所有内容都被调用,因为print("The url is \(url)")会返回文件的路径(但实际上我无法跟踪文件)。

以下是模拟器上声音的一般路径:

file:///Users/[...]/Library/Developer/CoreSimulator/Devices/116C311A-C7F3-44EC-9762-2FAA0F9FE966/data/Containers/Data/Application/60BFCDE7-AC02-4196-8D1A-24EC646C4622/tmp/CFNetworkDownload_7VDpsV.tmp

然而,在手机上运行它会返回:

file:///private/var/mobile/Containers/Data/Application/C75C1F1D-77E9-4795-9A38-3F0756D30547/tmp/CFNetworkDownload_T1XlPb.tmp

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我选择了另一种解决方案,因为app doc说:

  

临时文件的文件URL。因为文件是临时的,你   必须打开文件进行读取或将其移动到永久文件   返回之前在应用程序的沙箱容器目录中的位置   来自这个委托方法。

这个想法只是从tmp目录复制到文档目录并从文档目录中播放。

创建成员变量:

var player = AVAudioPlayer()

现在实施 downloadSound 方法,如下所示:

func downloadSound(url:URL){
    let docUrl:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
    let desURL = docUrl.appendingPathComponent("tmpsong.m4a")
    var downloadTask:URLSessionDownloadTask
    downloadTask = URLSession.shared.downloadTask(with: url, completionHandler: { [weak self](URLData, response, error) -> Void in
        do{
            let isFileFound:Bool? = FileManager.default.fileExists(atPath: desURL.path)
            if isFileFound == true{
                  print(desURL) //delete tmpsong.m4a & copy
            } else {
                try FileManager.default.copyItem(at: URLData!, to: desURL)
            }
            let sPlayer = try AVAudioPlayer(contentsOf: desURL!)
            self?.player = sPlayer
            self?.player.prepareToPlay()
            self?.player.play()

        }catch let err {
            print(err.localizedDescription)
        }

        })
    downloadTask.resume()
}

这只是一个示例解决方案。