我有一个视频聊天消息应用程序,使用AVFoundation
和Firebase
记录,存储和播放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
}
作为一个临时的解决方案,我研究了压缩文件。
上传是much更快,但质量更差,理想情况下不应该妥协。
如果有人有更好的解决方案,我将非常感激并乐意听到!