Ios Can';t播放从S3存储桶下载的声音文件

Ios Can';t播放从S3存储桶下载的声音文件,ios,swift,amazon-web-services,amazon-s3,avfoundation,Ios,Swift,Amazon Web Services,Amazon S3,Avfoundation,我在用Swift编写的iOS应用程序上遇到了一个奇怪的问题,即.m4a声音文件 发生的情况如下: 我使用应用程序在设备上录制声音文件。让我们称之为xyz.m4a 我检查是否可以播放此声音文件,并且它正在工作 然后,我将声音文件从我的应用程序上传到AWS S3存储桶中 我在AWS控制台上检查文件是否按预期上传,并使用浏览器(在我的计算机上)下载,再次检查是否仍能按预期播放声音。到目前为止没有什么问题,我可以播放声音 然后我用我的应用程序将文件下载到我的iOS设备(iPhone 6)。这里的一切似

我在用Swift编写的iOS应用程序上遇到了一个奇怪的问题,即.m4a声音文件

发生的情况如下:

  • 我使用应用程序在设备上录制声音文件。让我们称之为xyz.m4a
  • 我检查是否可以播放此声音文件,并且它正在工作
  • 然后,我将声音文件从我的应用程序上传到AWS S3存储桶中
  • 我在AWS控制台上检查文件是否按预期上传,并使用浏览器(在我的计算机上)下载,再次检查是否仍能按预期播放声音。到目前为止没有什么问题,我可以播放声音
  • 然后我用我的应用程序将文件下载到我的iOS设备(iPhone 6)。这里的一切似乎都很好
  • 最后,我尝试在我的应用程序中播放下载的文件,这就是问题所在。我不能玩它
这里是我认为是相关的代码,请让我知道,如果你认为我应该添加更多

从AWS S3存储桶下载文件的代码:

    let transferUtility = AWSS3TransferUtility.default()
    transferUtility.downloadData(
        fromBucket: "mybucket",
        key: "xyz.m4a",
        expression: expression,
        completionHandler: completionHandler
        ).continueWith {
            (task) -> AnyObject! in if let error = task.error {
                print("Error: \(error.localizedDescription)")
            }

            if let _ = task.result {
                // Do something with downloadTask.
                print("task.result -- OK!")
                let downloadOutput = task.result
                print("downloadOutput:\(String(describing: downloadOutput))")
            }
            return nil;
    }
以下是completionHandler部分:

    var completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock?
    completionHandler = {
        [weak self] (task, URL, data, error) -> Void in
        DispatchQueue.main.async(execute: {
            print("transfer completion OK!")
            let localFileName = "xyz.m4a",
            playFileURL = self?.getDocumentsURL().appendingPathComponent(localFileName)
            FileManager.default.createFile(atPath: (playFileURL?.path)!,
                                           contents: data,
                                           attributes: nil)

            if FileManager.default.fileExists(atPath: (playFileURL?.path)!) {
                print("playFileURL present!") // Confirm that the file is here!
            }
        })
    }
播放下载的声音文件的代码:

    let fileName = "xyz.m4a", 
    audioFile = getDocumentsURL().appendingPathComponent(fileName)

    if !FileManager.default.fileExists(atPath: audioFile.path) {
        print("We have no file !!!!!") // Just in case the file was not found!
    }

    // This code assumes the file exists.
    do {try soundSession.setCategory(AVAudioSessionCategoryPlayback)
        try soundSession.setActive(true)

        if audioPlayer == nil {
            audioPlayer = try AVAudioPlayer(contentsOf: audioFile,
                                            fileTypeHint: AVFileType.m4a.rawValue)
            guard let _ = audioPlayer else {return}
            audioPlayer.delegate = self
        }

        audioPlayer.play()
    } catch let error {
        print("Error:\n" + error.localizedDescription)
    }
最后是我得到的错误:

Error:
The operation couldn’t be completed. (OSStatus error 1685348671.)

我希望有人能看到一些错误,并告诉我问题出在哪里。

该文件可能格式不正确,或者不是该类型音频文件的有效实例,或者无法识别为音频文件。您的评论非常有意义。问题是:它是什么时候改变的?在上传之前,我可以播放它,所以它是一个有效的音频文件。当它在服务器上时,它仍然是一个有效的音频文件,正如您在阅读我的文章时所看到的。只有在我下载之后,它才会失效。我们怎么解释呢?你能想到我做了什么坏事吗?在你的完成处理程序中,你检查FileManager.default.fileExists(…)。您可以更安全地检查之前的调用(
FileManager.default.createFile(…)
)是否返回
true
。好的,您有道理。我只是照你说的做了检查,但结果是真的,所以问题一定出在别的地方。事实上,我也检查了之前没有的文件。你能分享你下载文件的网址吗???