Проблема с представлением и отклонением AVPlayer Controller - PullRequest
0 голосов
/ 15 января 2019

Итак, у меня есть приложение, которое принимает и записывает видео для отправки на сервер и последующего просмотра.

Последовательность событий следующая 1. Видео записано 2. Фильтр или текст добавлен 3. Отправлено на сервер 4. Откажитесь от avplayer и вернитесь к камере

Все работает, но на четвертом шаге avplayer никогда не отказывается, и все, что я вижу, это.

enter image description here

Это изображение всех компонентов пользовательского интерфейса на контроллере avplayer, за исключением реального видео.

Я позаботился о том, чтобы я вызвал «присутствовать» и «уволить», чтобы не было проблемы, когда я использовал неправильную комбинацию методов представления контроллера представления и увольнения. Когда я добираюсь до этого экрана, мне нужно снова нажать X, чтобы вернуться к камере, чего не должно быть.

/// Add the story to firebase
func handleAddToStory() {
    print("Attempting to add to story")
    self.dismiss(animated: true, completion: nil)
    // hide the color slider so we can return the image of the tapView that contains the text field if they added one
    colorSlider.isHidden = true
    colorSlider.isHidden = false





    DispatchQueue.global(qos: .background).async {
        print("This is run on the background queue")

        let videoImage = self.imageWithView(inView: self.tapView)


        // Export the video
        self.video?.exportFilterVideo(videoComposition: self.avVideoComposition , completion: { (url) in

            if let videoImage = videoImage {

                let filterVideoAsset = AVAsset(url: url! as URL)

                // Now merge the filtered video with tapView image which will contain the textfield if the user added one
                Merge(config: .standard).overlayVideo(video: filterVideoAsset, overlayImage: videoImage, completion: { (finalVideoUrl) in

                    // Upload to firebase storage
                    let dateFormatter = ISO8601DateFormatter()
                    let timeStamp = dateFormatter.string(from: Date())
                    let uid = User.current.uid
                    let storageRef = Storage.storage().reference().child("event_stories").child(self.eventKey).child(uid).child(timeStamp + ".mp4")
                    StorageService.uploadVideo(finalVideoUrl! as URL, at: storageRef) { (downloadUrl) in
                        guard let downloadUrl = downloadUrl else {
                            return
                        }

                        let videoUrlString = downloadUrl.absoluteString
                        print(videoUrlString)
                        // Post to firebase
                        PostService.create(for: self.eventKey, for: videoUrlString)
                    }

                }, progressHandler: { _ in })


            } else {

                let dateFormatter = ISO8601DateFormatter()
                let timeStamp = dateFormatter.string(from: Date())
                let uid = User.current.uid
                let storageRef = Storage.storage().reference().child("event_stories").child(self.eventKey).child(uid).child(timeStamp + ".mp4")
                StorageService.uploadVideo(url! as URL, at: storageRef) { (downloadUrl) in
                    guard let downloadUrl = downloadUrl else {
                        return
                    }

                    let videoUrlString = downloadUrl.absoluteString
                    print(videoUrlString)
                    PostService.create(for: self.eventKey, for: videoUrlString)
                }
                //svprogresshud insert here

            }

        })







        DispatchQueue.main.async {
            print("This is run on the main queue, after the previous code in outer block")
            self.dismiss(animated: true, completion: nil)
            self.videoPlayer?.replaceCurrentItem(with: nil)

        }
    }


}

Это функция, которая обрабатывает добавление на сервер. Выполняется некоторая асинхронная задача, но она не должна вмешиваться в увольнение контроллера, которое видно внизу. У кого-нибудь есть идеи, почему контроллер представления все еще присутствует?

Ниже приведен фрагмент кода, представляющий вышеупомянутый контроллер представления.

  if let event = self.event {
                        let video = AVURLAsset(url: videoURL)
                        let videoViewController = FilterVideoViewController(video: video)
                        videoViewController.event = event
                        SVProgressHUD.dismiss(completion: {
                            self.present(videoViewController, animated: false, completion: nil)
                        })

                    }

1 Ответ

0 голосов
/ 16 января 2019

Эти детали

video?.exportFilterVideo(videoComposition: avVideoComposition , completion: { (url) in 
   Merge(config: .standard).overlayVideo(video: filterVideoAsset, overlayImage: videoImage, completion: { (finalVideoUrl) in

делают основной поток очень занятым. так что вам нужна фоновая очередь типа

 func handleAddToStory() {
    print("Attempting to add to story")

    // hide the color slider so we can return the image of the tapView that contains the text field if they added one
    colorSlider.isHidden = true
    let videoImage = self.imageWithView(inView: self.tapView)
    colorSlider.isHidden = false
    self.dismiss(animated:false, completion: nil)
    self.videoPlayer?.replaceCurrentItem(with: nil)


    DispatchQueue.main.asyncAfter(deadline: .now() + 0.7 ) {

            video?.exportFilterVideo(videoComposition: avVideoComposition , completion: { (url) in

                if let videoImage = videoImage {

                    let filterVideoAsset = AVAsset(url: url! as URL)

                    // Now merge the filtered video with tapView image which will contain the textfield if the user added one
                    Merge(config: .standard).overlayVideo(video: filterVideoAsset, overlayImage: videoImage, completion: { (finalVideoUrl) in

                        upload(finalVideoUrl! as URL)  

                    }, progressHandler: { _ in })


                } else {

                   upload(url! as URL)

                }

            })

    }


}

func upload(_ url:URL) {

 DispatchQueue.global().async {

    let dateFormatter = ISO8601DateFormatter()
    let timeStamp = dateFormatter.string(from: Date())
    let uid = User.current.uid
    let storageRef = Storage.storage().reference().child("event_stories").child(self.eventKey).child(uid).child(timeStamp + ".mp4")
    StorageService.uploadVideo(url, at: storageRef) { (downloadUrl) in
        guard let downloadUrl = downloadUrl else {
            return
        }

        let videoUrlString = downloadUrl.absoluteString
        print(videoUrlString)
        PostService.create(for: self.eventKey, for: videoUrlString)
    }

 }

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