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

标签 ios swift firebase avaudioplayer firebase-storage

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

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

音频文件和音频 url 已成功上传到 Firebase,但是当我尝试播放音频时,它显示此错误:操作无法完成。 (OSStatus 错误 2003334207。)。

项目越来越大,我使用 AVAudio 的经验很少,所以如果你们之前遇到过类似的问题,请教我如何解决它。谢谢!!!

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

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

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

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

下面是我如何为上面的 audioRecorder 设置 url。

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

func getAudiFileURL() -> URL {
    return getDocumentsDirectory().appendingPathComponent(".m4a")
}

这是我播放音频的地方:

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

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

最佳答案

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

关于ios - Swift 3 录制音频并上传到 Firebase 存储和播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748738/

相关文章:

ios - 如何使用 Firebase 通知控制台在 APNS 负载中添加 mutable_content?

firebase - Firebase中基于角色的身份验证

ios - "Missing Marketing Icon. iOS Apps must include a 1024x1024px"如何解决

ios - InAppSettingsKit自动弹出UINavigationController?

ios - 在某些选项卡上选择时,选项卡栏背景会更改颜色

swift - NSURLUnsupportedURL -1002 看似有效的 URL

ios - swift 2.2 循环的新语法

ios - viewDidAppear,还有当应用程序从后台返回时

swift - 自定义委托(delegate)不会从 ContainerView 执行

javascript - 按值而不是键对 react native 对象列表进行排序