在 Firebase 中播放和存储视频

Posted

技术标签:

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

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

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

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

理想情况下...

    最好“预加载”获取的视频以在命令下立即播放,但对于 AVPlayer 似乎不可能,其中加载和播放仅在调用方法 .play() 时发生。 在实际录制过程中同时上传是否有可能?或者,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

【问题讨论】:

第一个问题看developer.apple.com/documentation/avfoundation/avqueueplayer 【参考方案1】:

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

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

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

【讨论】:

以上是关于在 Firebase 中播放和存储视频的主要内容,如果未能解决你的问题,请参考以下文章

保存和播放使用 Firebase 存储下载的视频

使用来自 firebase 存储的 react-native-video 播放视频

减少 Firebase 存储带宽

将Firebase存储与Google云CDN集成

Cloud Functions for Firebase:在不触及最大超时的情况下完成长流程

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba