Как сохранить видео в правильной ориентации? - PullRequest
0 голосов
/ 03 апреля 2019

В моем приложении есть камера, которая может изменять ориентацию.
Первоначально ориентация камеры устанавливается исходя из текущей ориентации устройства.

captureSession.addOutput(videoOutput!)
cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.current.orientation.rawValue) ?? .portrait

При повороте я меняю ориентацию камеры.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        coordinator.animate(alongsideTransition: nil) { _ in UIView.setAnimationsEnabled(true) }
        UIView.setAnimationsEnabled(false)
        super.viewWillTransition(to: size, with: coordinator)

        Logger.Log("VIEW WILL TRANSITION")
        if let videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.current.orientation.rawValue) {
            Logger.Log("videoOrientation updated")
            cameraPreviewLayer?.connection?.videoOrientation = videoOrientation
        }

        cameraPreviewLayer?.frame.size = size
    }

После завершения записи я передаю URL видео на AVPlayer. И вы можете видеть, что проигрыватель воспроизводит видео в неправильной ориентации.

if let _ = link {
            let player = AVPlayer(url: link!)
            self.player = player
            self.player?.play()

        }

Например, так я делаю запись в альбомной ориентации.

* +1012 *landscape record

И я получаю следующий результат. Хотя результат должен выглядеть наоборот.

wrong portret wrong landscape

На сервере он также хранится в неправильной ориентации.

wrong on server

Я смотрел этот вопрос . Но похоже я уже назначаю ориентацию при записи.

Я тоже смотрел этот вопрос . Я пытался увидеть, отличается ли видео, воспроизводимое плеером, в разных ориентациях. Но я всегда получаю один и тот же результат.

func playLink(){
        if let _ = link {
            let player = AVPlayer(url: link!)
            self.player = player
            self.player?.play()

        }

        let videoAssetTrack = self.player?.currentItem?.asset.tracks(withMediaType: .video).first
        let videoTransform = videoAssetTrack?.preferredTransform

        Logger.Log("videoTransform = \(videoTransform)")
    }

videoTransform = Необязательный (__ C.CGAffineTransform (a: 0,0, b: 1,0, c: -1,0, d: 0,0, tx: 1080,0, ty: 0,0))

Помогите мне пожалуйста, что я должен сделать, чтобы получить правильный результат на выходе?

1 Ответ

0 голосов
/ 03 апреля 2019

Видимо сначала я поступил неправильно в этом ответе .
Я просто взял connection и orientation как глобальные поля всего класса и обратился к ним.
Теперь я добавил следующий код, и это решает мою проблему.

var currentOrientation: AVCaptureVideoOrientation?
var videoConnection: AVCaptureConnection?
captureSession.addOutput(videoOutput!)

            videoConnection = videoOutput!.connection(with: .video)

            if (videoConnection!.isVideoOrientationSupported) {
                Logger.Log("connection!.isVideoOrientationSupported")
                if let capOr = AVCaptureVideoOrientation(rawValue: UIDevice.current.orientation.rawValue) {
                    Logger.Log("connection!.videoOrientation = \(capOr.rawValue)")
                    currentOrientation = capOr
                    videoConnection!.videoOrientation = currentOrientation!
                } else {
                    currentOrientation = .portrait
                    videoConnection!.videoOrientation = currentOrientation!
                }
            }
cameraPreviewLayer?.connection?.videoOrientation = currentOrientation! 
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        coordinator.animate(alongsideTransition: nil) { _ in UIView.setAnimationsEnabled(true) }
        UIView.setAnimationsEnabled(false)
        super.viewWillTransition(to: size, with: coordinator)

        Logger.Log("VIEW WILL TRANSITION")
        if let videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.current.orientation.rawValue) {
            Logger.Log("videoOrientation updated = \(videoOrientation.rawValue)")

            currentOrientation = videoOrientation
            videoConnection?.videoOrientation = currentOrientation!
            cameraPreviewLayer?.connection?.videoOrientation = currentOrientation!
        }

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