【发布时间】:2021-11-10 20:33:36
【问题描述】:
我有一个视频聊天消息应用程序,使用 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
}
【问题讨论】:
标签: ios swift firebase avfoundation firebase-storage