ios - 如何将视频文件发送到 ios 中的 Firebase 存储
问题描述
我正在开发一个视频共享 iOS 应用程序并Firebase5
用作后端。它允许用户选择视频并将其发送到存储。当我尝试视频无法推送到database
服务器时。下面是我的代码:
static func uploadVideoToFirebaseStorage(videoUrl: URL, onSuccess: @escaping (_ videoUrl: String) -> Void) {
let videoIdString = NSUUID().uuidString
//Config.STORAGE_ROOT_REF is var STORAGE_ROOT_REF = "gs://****-cdc3c.appspot.com"
let storageRef = Storage.storage().reference(forURL: Config.STORAGE_ROOT_REF).child("posts").child(videoIdString)
storageRef.putFile(from: videoUrl, metadata: nil) { (metadata, error) in
if error != nil {
ProgressHUD.showError(error!.localizedDescription)
return
}
}
storageRef.downloadURL(completion: { (url, error) in
if let error = error {
return
}else {
let videoUrl = url!.absoluteString
onSuccess(videoUrl)
}
})
}
解决方案
调用此函数将视频上传到 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)
})
}
推荐阅读
- pine-script - 如何扩展移动平均线图?
- c++ - 从相同的参数调用 mpz_nextprime 是否正确?
- python - Keep Session Alive Cloudscraper
- powershell - PowerShell 会尝试找出脚本的编码吗?
- python - Opencv加入边界框python
- html - 我们可以使用 inside 吗?如果是,那么标签用它的类替换外部?
- swift - 应用程序快速重建时无法播放视频
- r - ggiraph 交互式绘图可以是 R 闪亮窗口的大小吗?
- laravel-artisan - 不能将 migrate 与帆 laravel 一起使用
- flutter - 如何在构建时调用 futureprovider (riverpod)