Ios Can';t播放从S3存储桶下载的声音文件
我在用Swift编写的iOS应用程序上遇到了一个奇怪的问题,即.m4a声音文件 发生的情况如下: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)。这里的一切似
- 我使用应用程序在设备上录制声音文件。让我们称之为xyz.m4a
- 我检查是否可以播放此声音文件,并且它正在工作
- 然后,我将声音文件从我的应用程序上传到AWS S3存储桶中
- 我在AWS控制台上检查文件是否按预期上传,并使用浏览器(在我的计算机上)下载,再次检查是否仍能按预期播放声音。到目前为止没有什么问题,我可以播放声音
- 然后我用我的应用程序将文件下载到我的iOS设备(iPhone 6)。这里的一切似乎都很好
- 最后,我尝试在我的应用程序中播放下载的文件,这就是问题所在。我不能玩它
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
。好的,您有道理。我只是照你说的做了检查,但结果是真的,所以问题一定出在别的地方。事实上,我也检查了之前没有的文件。你能分享你下载文件的网址吗???