无法播放从S3存储桶下载的声音文件

时间:2018-04-17 05:06:17

标签: ios swift amazon-web-services amazon-s3 avfoundation

我在使用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.)

我希望有人能看到错误,告诉我问题所在。

0 个答案:

没有答案