首页 > 解决方案 > 如何将视频文件发送到 ios 中的 Firebase 存储

问题描述

我正在开发一个视频共享 iOS 应用程序并Firebase5用作后端。它允许用户选择视频并将其发送到存储。当我尝试视频无法推送到database服务器时。下面是我的代码:

static func uploadVideoToFirebaseStorage(videoUrl: URL, onSuccess: @escaping (_ videoUrl: String) -> Void) {
    let videoIdString = NSUUID().uuidString
    //Config.STORAGE_ROOT_REF is var STORAGE_ROOT_REF = "gs://****-cdc3c.appspot.com"
    let storageRef = Storage.storage().reference(forURL: Config.STORAGE_ROOT_REF).child("posts").child(videoIdString)
    storageRef.putFile(from: videoUrl, metadata: nil) { (metadata, error) in
        if error != nil {
            ProgressHUD.showError(error!.localizedDescription)
            return
        }
    }
    storageRef.downloadURL(completion: { (url, error) in
        if let error = error {
            return
        }else {
            let videoUrl = url!.absoluteString
            onSuccess(videoUrl)
        }
    })
}      

标签: iosswiftfirebase

解决方案


调用此函数将视频上传到 Firebase 存储

func uploadTOFireBaseVideo(url: URL,
                                  success : @escaping (String) -> Void,
                                  failure : @escaping (Error) -> Void) {

    let name = "\(Int(Date().timeIntervalSince1970)).mp4"
    let path = NSTemporaryDirectory() + name

    let dispatchgroup = DispatchGroup()

    dispatchgroup.enter()

    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let outputurl = documentsURL.appendingPathComponent(name)
    var ur = outputurl
    self.convertVideo(toMPEG4FormatForVideo: url as URL, outputURL: outputurl) { (session) in

        ur = session.outputURL!
        dispatchgroup.leave()

    }
    dispatchgroup.wait()

    let data = NSData(contentsOf: ur as URL)

    do {

        try data?.write(to: URL(fileURLWithPath: path), options: .atomic)

    } catch {

        print(error)
    }

    let storageRef = Storage.storage().reference().child("Videos").child(name)
    if let uploadData = data as Data? {
        storageRef.putData(uploadData, metadata: nil
            , completion: { (metadata, error) in
                if let error = error {
                    failure(error)
                }else{
                    let strPic:String = (metadata?.downloadURL()?.absoluteString)!
                    success(strPic)
                }
        })
    }
}

以下功能将视频转换为 mp4 格式,以便可以在任何设备上查看,无论是 iOS 还是 android

func convertVideo(toMPEG4FormatForVideo inputURL: URL, outputURL: URL, handler: @escaping (AVAssetExportSession) -> Void) {
    try! FileManager.default.removeItem(at: outputURL as URL)
    let asset = AVURLAsset(url: inputURL as URL, options: nil)

    let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality)!
    exportSession.outputURL = outputURL
    exportSession.outputFileType = .mp4
    exportSession.exportAsynchronously(completionHandler: {
        handler(exportSession)
    })
}

推荐阅读