私はチャットルームアプリケーションを作成していますが、これまでメッセージ、画像、ビデオを送信できます。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")
}
そして、私は、オーディオ再生する場所です:私は実際にはURLが罰金であることを意味しており、URLを使用してFirebaseから音声ファイルをダウンロードして、自分のコンピュータ上で再生することができ
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)
}
}
}
を。