使用 SwiftUI 和 AVFoundation 将音频文件上传到 Firebase

问题描述

我想将音频文件上传到 Firebase 存储,然后提取它们进行播放。我尝试将 的路径存储在全局变量中:

var fileURL: URL?

目前我有以下代码使用 AVFoundation 录制音频:

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 (将#修改为@)