Swift 3 录制音频并上传到 Firebase 存储并播放

Bry*_*han 10 avaudioplayer ios firebase swift firebase-storage

我正在制作一个聊天室应用程序,到目前为止它能够发送消息、图像和视频。

\n

我使用非常相似的方法来发送视频并且它有效,但在发送音频时它不起作用。

\n

音频文件和音频网址已成功上传到 Firebase,但是当我尝试播放音频时,它显示此错误:操作无法\xe2\x80\x99t 完成。(操作系统状态错误 2003334207。)。

\n

该项目变得非常庞大,而且我使用 AVAudio 的经验很少,所以如果你们以前遇到过类似的问题,请教我如何解决它。谢谢!!!

\n

这是设置audioRecorder的代码,我在这里获取url并将其传递给其他函数以将音频文件放入Firebase存储中。

\n
func startRecording() {\n    let settings = [\n        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),\n        AVSampleRateKey: 12000,\n        AVNumberOfChannelsKey: 1,\n        AVEncoderAudioQualityKey: AVAudioQuality.low.rawValue\n    ]\n    \n    do {\n        let audioFileUrl = getAudiFileURL()\n        audioRecorder = try AVAudioRecorder(url: audioFileUrl, settings: settings)\n        audioRecorder.delegate = self\n        audioRecorder.record()\n        blackView.isHidden = false\n    } catch {\n        finishRecording(success: false)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我尝试将音频文件上传到 Firebase 存储的地方,它确实打印出了正确的 downloadURL。(URL 指向文件在 iOS 设备中的位置。)

\n
func handleAudioSendWith(url: String) {\n    guard let fileUrl = URL(string: url) else {\n        return\n    }\n    let fileName = NSUUID().uuidString + ".m4a"\n    \n    FIRStorage.storage().reference().child("message_voice").child(fileName).putFile(fileUrl, metadata: nil) { (metadata, error) in\n        if error != nil {\n            print(error ?? "error")\n        }\n        \n        if let downloadUrl = metadata?.downloadURL()?.absoluteString {\n            print(downloadUrl)\n            let values: [String : Any] = ["audioUrl": downloadUrl]\n            self.sendMessageWith(properties: values)\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以下是我为上面的 audioRecorder 设置 url 的方法。

\n
func getDocumentsDirectory() -> URL {\n    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)\n    let documentsDirectory = paths[0]\n    return documentsDirectory\n}\n\nfunc getAudiFileURL() -> URL {\n    return getDocumentsDirectory().appendingPathComponent(".m4a")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这就是我播放音频的地方:

\n
func handleAudioPLay() {\n    if let audioUrl = message?.audioUrl, let url = URL(string: audioUrl) {\n        do {\n            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)\n            audioPlayer = try AVAudioPlayer(contentsOf: url)\n            audioPlayer?.delegate = self\n            audioPlayer?.prepareToPlay()\n            audioPlayer?.play()\n            print("Audio ready to play")\n        } catch let error {\n            print(error.localizedDescription)\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我实际上可以使用该 url 从 Firebase 下载声音文件并在我的计算机上播放,这意味着该 url 没问题。

\n

Bry*_*han 7

我通过使用 URLSession 下载声音文件并使用 AVAudioPlayer(data: data!, fileTypeHint: "aac") 播放它解决了这个问题。