【问题标题】:How to send video file to firebase storage in ios如何将视频文件发送到 ios 中的 Firebase 存储
【发布时间】:2018-07-07 11:51:28
【问题描述】:

我正在开发一个视频共享 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)
        }
    })
}      

【问题讨论】:

    标签: ios swift firebase


    【解决方案1】:

    调用此函数将视频上传到 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)
        })
    }
    

    【讨论】:

      【解决方案2】:

      调用此函数将视频上传到 Firebase 存储。它对我有用,以防您有任何困惑

       static func upload(file: URL, completion: @escaping UploadCompletion) {
          let name = "\(Int(Date().timeIntervalSince1970)).mp4"
          do {
              let data = try Data(contentsOf: file)
              
              let storageRef = 
          Storage.storage().reference().child("Videos").child(name)
              if let uploadData = data as Data? {
                  let metaData = StorageMetadata()
                  metaData.contentType = "video/mp4"
                  storageRef.putData(uploadData, metadata: metaData
                                     , completion: { (metadata, error) in
                                      if let error = error {
                                          completion(nil, error.localizedDescription)
                                      }else{
                                          storageRef.downloadURL { (url, error) in
                                              guard let downloadURL = url else {
                                                  completion(nil, error?.localizedDescription ?? "")
                                                  return
                                              }
                                              completion(downloadURL, nil)
                                          }
                                      }
                                     })
              }
          }catch let error {
              print(error.localizedDescription)
          }
          
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-10
        • 1970-01-01
        • 2017-10-25
        • 2018-05-17
        • 2018-06-21
        • 2020-09-21
        • 2018-08-23
        • 2017-10-20
        相关资源
        最近更新 更多