【问题标题】:Playing and Storing Videos From/To Firebase在 Firebase 中播放和存储视频
【发布时间】:2021-11-10 20:33:36
【问题描述】:

我有一个视频聊天消息应用程序,使用 AVFoundationFirebase 来录制、存储和播放 1 分钟时长的视频。

一切正常,但有一个...

  1. 延迟播放提取的视频
  2. 上传录制的视频延迟,这里特别长

理想情况下...

  1. 最好“预加载”获取的视频以在命令下立即播放,但对于 AVPlayer 似乎不可能,其中加载和播放仅在调用方法 .play() 时发生。
  2. 在实际录制过程中同时上传是否有可能?或者,Firebase Storage 是否在第一次触发上传视频的网络调用后,应用可以进入后台并仍然完成?

诚然,我在管理视频方面完全是初学者,但我还没有找到任何具体指南来说明如何消除或优化减少延迟以获得更好的用户体验(即 Instagram 播放和上传 Instagram 视频故事)。任何帮助将不胜感激..

func playVideo(with outputFileURL: URL) {
    
    DispatchQueue.main.async {
        self.setView(view: self.progressBar, hidden: true)
        self.progressBar.progress = 0
        
        let asset = AVAsset(url: outputFileURL)
        let item = AVPlayerItem(asset: asset)
        self.avPlayer.replaceCurrentItem(with: item)
        
        let previewLayer = AVPlayerLayer(player: self.avPlayer)
        previewLayer.frame = self.view.bounds
        previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
        self.previewView.layer.addSublayer(previewLayer)            
        
        self.view.layoutIfNeeded()            
        
        self.avPlayer.play()
    }
}

func uploadVideo(_ url: URL) {
    
    let filename = "x"
    
    let ref = Storage.storage().reference().child("videos").child("xyz").child(filename)
            
    let uploadTask = ref.putFile(from: url, metadata: nil, completion: { (_, err) in
        if let err = err {
            print("Failed to upload movie:", err)
            return
        }
        
        ref.downloadURL(completion: { (downloadUrl, err) in
            if let err = err {
                print("Failed to get download url:", err)
                return
            }
            
            guard let downloadUrl = downloadUrl else { return }
            
            if let thumbnailImage = self.thumbnailImageForFileUrl(url) {
                
                self.uploadToFirebaseStorageUsingImage(thumbnailImage, completion: { (imageUrl) in                        
                    print("saved video url: \(downloadUrl) and saved image url: \(imageUrl)")
                })
            }

        })
    })

    uploadTask.observe(.progress) { (snapshot) in
        print("In Progress")
    }

    uploadTask.observe(.success) { (snapshot) in
        print("Done")
    }
}

func thumbnailImageForFileUrl(_ fileUrl: URL) -> UIImage? {
    let asset = AVAsset(url: fileUrl)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true
    
    do {
    
        let thumbnailCGImage = try imageGenerator.copyCGImage(at: CMTimeMake(value: 2, timescale: 60), actualTime: nil)
        return UIImage(cgImage: thumbnailCGImage)
        
    } catch let err {
        print(err)
    }
    
    return nil
}

【问题讨论】:

标签: ios swift firebase avfoundation firebase-storage


【解决方案1】:

作为临时解决方法,我查看了compressing the file

上传速度快很多,但质量更差,理想情况下不应该妥协。

如果有人有更好的解决方案,我会非常感激并喜欢听到它!

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2020-05-05
    相关资源
    最近更新 更多