使用Swift将视频上传到Firebase

时间:2020-08-31 02:27:56

标签: ios swift firebase firebase-storage

我正在尝试从相机胶卷中选择一个视频,然后将该视频上传到Firebase存储。到目前为止,我可以选择一个视频,但不能将其上传到Firebase,如何将其上传到Firebase存储?

func uploadVideoToDB(url: URL){
        let storageReference = Storage.storage().reference().child("video.mov")
        storageReference.putFile(from: url)

}

func fetchVideos(section: Int){
        imagePickerController.sourceType = .photoLibrary
        imagePickerController.delegate = self
        imagePickerController.mediaTypes = ["public.movie"]

        present(imagePickerController, animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){
    
        let url = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerReferenceURL")] as? NSURL
        DataService.instance.uploadVideoToDB(url: url! as URL)
        
        imagePickerController.dismiss(animated: true, completion: nil)
        
    }

2 个答案:

答案 0 :(得分:0)

调用此功能可将视频上传到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)
    })
}

答案 1 :(得分:0)

这是为我做的:

需要将url转换为Data,然后使用putData而不是putFile

func uploadVideoToDB(url: URL){
        let filename = UUID().uuidString
        let ref = Storage.storage().reference().child("videos").child("\(filename).mp4")
        do {
            let videoData = try Data(contentsOf: url)
            ref.putData(videoData)
        } catch {
            print(error)
        }
    }