1
我正在製作聊天室應用程序,到目前爲止它能夠發送消息,圖像和視頻。Swift 3錄製音頻並上傳到Firebase存儲並播放
我使用一種非常類似的方法來發送視頻,它的工作原理,但它發送音頻時不起作用。
音頻文件和音頻url已成功上傳到Firebase,但是當我嘗試播放音頻時,它顯示此錯誤:操作無法完成。 (OSStatus錯誤2003334207.)。
該項目變得相當龐大,我使用AVAudio的經驗很少,所以如果你們之前有類似的問題,請教我如何解決它。謝謝!!!
以下是設置audioRecorder的代碼,我在此處獲取url並將其傳遞給其他func以將音頻文件存儲到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。
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實際下載聲音文件並播放我的電腦,這意味着網址是罰款。