Я хочу загрузить видео, которое было записано AV.
Это работает, когда я использую свою функцию API внутри забавного c fileOutput ().
var urlToUpload: URL?
/// - Tag: DidFinishRecording
func fileOutput(_ output: AVCaptureFileOutput,
didFinishRecordingTo outputFileURL: URL,
from connections: [AVCaptureConnection],
error: Error?) {
urlToUpload = outputFileURL
PostApi.shared.uploadTOFireBaseVideo(url: urlToUpload!, userUid: "huhu", success: {
}) {
}
Однако, когда я называю это так:
// Upload a post to Firestore
@IBAction func buttonSendPostTapped(_ sender: RoundedButton) {
print(urlToUpload!)
-> (Optional(file:///private/var/mobile/Containers/Data/Application/60C494F1-2C08-476A-81C2-052A51987682/tmp/517523BC-B84B-460D-81C9-2D8FDB4051BA.mov))
PostApi.shared.uploadTOFireBaseVideo(url: urlToUpload!, userUid: "huhu", success: {
}) {
}
}
Это НЕ будет работать.
Как я загружаю данные:
let data = NSData (contentsOf: ur as URL) <- «data» равно nil, когда я вызываю его из buttonTapped и работает правильно, если я вызываю его из fileOutput (). </p>
Почему мои данные равны nil, когда я вызываю их из buttonTapped ?
// Upload media to firestore
func uploadTOFireBaseVideo(url: URL, userUid: String, success : @escaping () -> Void, failure : @escaping () -> Void) {
let db = Firestore.firestore()
let name = "\(Int(Date().timeIntervalSince1970)).mp4"
let dispatchgroup = DispatchGroup()
dispatchgroup.enter()
let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
let outputurl = documentsURL.appendingPathComponent(name)
var ur = outputurl
print(ur)
self.convertVideo(toMPEG4FormatForVideo: url as URL, outputURL: outputurl) { (session) in
ur = session.outputURL!
dispatchgroup.leave()
}
dispatchgroup.wait()
let data = NSData(contentsOf: ur as URL)
let storageRef = Storage.storage().reference().child("Media").child(name)
if let uploadData = data as Data? {
print("if let uploaded data")
storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
if error != nil {
print(error!)
return
}
storageRef.downloadURL(completion: { (url, error) in
if error != nil {
print(error!)
return
}
let mediaUrl = url?.absoluteString
let dic = ["userUid" : userUid, "postMediaUrl" : mediaUrl ?? "No Media"] as [String : Any]
db.collection("posts-media").document(userUid).setData(dic)
{ err in
if let err = err {
print("Error adding document: \(err)")
failure()
return
} else {
print("Document added")
success()
}
}
})
}
}
}
// Additional function to convert a video to mp4
func convertVideo(toMPEG4FormatForVideo inputURL: URL, outputURL: URL, handler: @escaping (AVAssetExportSession) -> Void) {
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)
})
}
file:///private/var/mobile/Containers/Data/Application/60C494F1-2C08-476A-81C2-052A51987682/tmp/517523BC-B84B-460D-81C9-2D8FDB4051BA.mov
Optional(file:///private/var/mobile/Containers/Data/Application/60C494F1-2C08-476A-81C2-052A51987682/tmp/517523BC-B84B-460D-81C9-2D8FDB4051BA.mov)