Swift 3 录制音频并上传到 Firebase 存储并播放
Swift 3 Record audio and upload to Firebase storage and play back
我正在做一个聊天室应用,目前可以发送消息,图片和视频。
我正在使用一种非常相似的方法来发送视频并且它可以工作,但是在发送音频时它不工作。
音频文件和音频 url 已成功上传到 Firebase,但是当我尝试播放音频时,它显示此错误:操作无法完成。 (操作系统状态错误 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 存储的地方,它确实打印出正确的下载 URL。
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") 播放它来解决问题。
我正在做一个聊天室应用,目前可以发送消息,图片和视频。
我正在使用一种非常相似的方法来发送视频并且它可以工作,但是在发送音频时它不工作。
音频文件和音频 url 已成功上传到 Firebase,但是当我尝试播放音频时,它显示此错误:操作无法完成。 (操作系统状态错误 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 存储的地方,它确实打印出正确的下载 URL。
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") 播放它来解决问题。