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

时间:2017-03-12 14:41:35

标签: ios swift firebase avaudioplayer firebase-storage

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

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

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

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

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

function control(err)
{
    if(err)
        console.log("Control function: " + err);
    else
        console.log('ok');
}

以下是我尝试将音频文件上传到Firebase存储的位置,它会打印出正确的downloadURL。

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)
    }
}

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

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)
        }
    }
}

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

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")
}

我实际上可以使用网址从Firebase下载声音文件并在我的计算机上播放,这意味着网址很好。

1 个答案:

答案 0 :(得分:3)

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