Различное поведение в функции, когда я использую ее в функции buttonTapped или в AV fileOutput для загрузки видео - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу загрузить видео, которое было записано 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)

1 Ответ

0 голосов
/ 01 апреля 2020

Проверьте реализацию метода fileOutput(...) ниже. Это внутренняя cleanup() процедура вызывается, когда поток управления покидает метод, который удаляет временный видеофайл. Это означает, что в вашем методе buttonSendPostTapped видеофайл, вероятно, больше не существует.

Вам необходимо убедиться, что fileOutput(...) хранит файл в сохраненном месте и удалить его, когда закончите с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...