如何使用 Swift 5 /SwiftUI 将 AVAudioRecorder 文件上传到 Firebase 存储?

Posted

技术标签:

【中文标题】如何使用 Swift 5 /SwiftUI 将 AVAudioRecorder 文件上传到 Firebase 存储?【英文标题】:How to upload AVAudioRecorder files to Firebase Storage with Swift 5 /SwiftUI? 【发布时间】:2021-04-18 14:20:33 【问题描述】:

您好,我知道这个问题已经被问过几次了,但我在将用户录音上传到 Firebase 方面需要帮助。当用户在应用中录制他们的音频并按下停止按钮时,我希望将录音上传并存储在 Firebase 而不是用户的手机中。

这是录音功能

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

这是用户停止录制时的功能

func saveRecording() 
    
    let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
       let directoryContents = try! FileManager.default.contentsOfDirectory(at: path, includingPropertiesForKeys: nil)

       for i in directoryContents 
        user.answersSent.append(CardModel(fullname: question.fullname, username: question.username, imageURL: question.imageURL, question: question.question, fileURL: i, createdAt: getCreationDate(for: i), colorChoice: question.colorChoice))
       
   
      
            
            user.answersSent.sort(by:  $0.createdAt?.compare($1.createdAt!) == .orderedDescending)
           
            
        
        
    
    

非常感谢您花时间阅读。我花了将近两天的时间试图弄清楚。

【问题讨论】:

您询问如何将文件上传到 Firebase 存储,但未包含任何 Firebase 代码。大局是,当您录制时,“文件”要么被写入内存或磁盘。当用户单击停止时,您希望将该文件从内存或磁盘上传到存储。 Firebase 入门指南Uploading files 对此进行了很好的介绍。那么除此之外,还有什么问题?您是否有一些您遇到困难的 Firebase 代码? 【参考方案1】:

    不要让您的 URL 立即超出范围,而是将其存储在运行此函数的任何类的属性中(如果您在 View 中执行此操作,请将所有记录逻辑移动到 ObservableObject )。

    在录制结束时,既然您有了 URL,您就不必进行 createdAt 排序,我假设您可能正在这样做以获得最新的文件(有点不清楚我现在)。

    使用 Firebase 文档 (https://firebase.google.com/docs/storage/ios/upload-files#upload_from_a_local_file) 中描述的方法上传本地文件:

// File located on disk
// Create a reference to the file you want to upload
let audioFileRef = storageRef.child("audioFiles/audioFile.m4a") //adjust this to have a unique name

let uploadTask = audioFileRef.putFile(from: localAudioURL, metadata: nil)  metadata, error in
  guard let metadata = metadata else 
    // Uh-oh, an error occurred!
    return
  
  //optionally, delete original local file here

    (可选)上传完成后删除本地文件。此外,您可以选择使用临时目录而不是文档目录来存储初始记录。

【讨论】:

以上是关于如何使用 Swift 5 /SwiftUI 将 AVAudioRecorder 文件上传到 Firebase 存储?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 按按钮移动到另一个视图 - swift 5.5

Swift UI笔记

如何使用 Swift 5 在 SwiftUI 中将颜色与 RGB 或十六进制值一起使用? [复制]

Helo 在 xcode 中的调试器上,使用 swift 和 swiftUI 5

SwiftUI:Toggle详解

Swift:SwiftUI中MapKit的使用体验