问题描述
我想将音频文件上传到 Firebase 存储,然后提取它们进行播放。我尝试将 的路径存储在全局变量中:
var fileURL: URL?
func startRecording() {
let recordingSession = AVAudioSession.sharedInstance()
do {
try recordingSession.setCategory(.playAndRecord,mode: .default)
try recordingSession.setActive(true)
}
catch {
print("Failed to set up recording session")
}
let documentPath = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask)[0]
let audioFilename = documentPath.appendingPathComponent("\(Date().toString(dateFormat: "dd-MM-YY_'at'_HH:mm:ss")).m4a")
self.fileURL = audioFilename
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),AVSampleRateKey: 12000,AVNumberOfChannelsKey: 1,AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
do {
audioRecorder = try AVAudioRecorder(url: audioFilename,settings: settings)
audioRecorder.record()
recording = true
}
catch {
print("Could not start recording with error: \(error)")
}
}
在此之后,我想停止录制,但也将文件上传到 Firebase。目前,我有一段代码,我根据上传文件形成本地参考点,参考 Firebase 文档编写了这段代码。我不确定如何访问音频文件的数据或将其直接上传到 Firebase 存储的好方法。这是完整的 viewmodel 代码:
import Foundation
import AVFoundation
import SwiftUI
import Combine
import Firebase
class Voiceviewmodel : NSObject,ObservableObject {
override init() {
super.init()
fetchRecordings()
}
var fileURL: URL?
let objectwillChange = PassthroughSubject<Voiceviewmodel,Never>()
var audioRecorder: AVAudioRecorder!
var recordings = [Recording]()
@Published var recording = false {
didSet {
objectwillChange.send(self)
}
}
func startRecording() {
let recordingSession = AVAudioSession.sharedInstance()
do {
try recordingSession.setCategory(.playAndRecord,settings: settings)
audioRecorder.record()
recording = true
}
catch {
print("Could not start recording with error: \(error)")
}
}
func stopRecording() {
audioRecorder.stop()
recording = false
let storageRef = Storage.storage().reference()
let localfile = self.fileURL ?? URL(string: "")
let fileRef = storageRef.child("images/try.m4a")
print(self.fileURL?.absoluteURL)
let uploadTask = fileRef.putFile(from: localfile!,Metadata: nil) { MetaData,err in
guard let Metadata = MetaData else { return }
if let err = err {
print(err.localizedDescription)
return
}
fileRef.downloadURL { (url,err) in
guard let downloadUrl = url else { return }
print(downloadUrl)
}
}
fetchRecordings()
}
func fetchRecordings() {
recordings.removeAll()
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory,in: .userDomainMask)[0]
let directoryContents = try! fileManager.contentsOfDirectory(at: documentDirectory,includingPropertiesForKeys: nil)
for audio in directoryContents {
let recording = Recording(fileURL: audio,createdAt: getCreationDate(for: audio))
recordings.append(recording)
recordings.sort(by: { $0.createdAt.compare($1.createdAt) == .orderedAscending})
objectwillChange.send(self)
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)