Necesidad de reflejar la orientación del video y manejar la rotation cuando se usa la camera frontal

No puedo entender cómo manejar las orientaciones de captura de video de la camera frontal. Tengo todas las rotaciones manejadas para la camera trasera al capturar videos e imágenes y todas las rotaciones manejadas para la camera frontal al tomar fotos, así como save los videos capturados y las imágenes con las orientaciones correctas también, excepto por la captura de video de la camera frontal.

El primer problema es cuando, en el modo horizontal, el video no se guarda correctamente con la orientación correcta. El segundo problema es que el video guardado se refleja. Aunque sé cómo manejar este efecto de reflection para la image con la camera frontal, no estoy seguro de qué llamar para manejar videos.

Tuve muchos problemas para tratar de encontrar algo específicamente para este problema y no lo hice. Si alguien puede apuntarme a un hilo que resuelva este problema específico, sería genial.

De cualquier manera, aquí está el método que se llama que maneja la orientación del video cuando cambia la orientación del dispositivo. No estoy seguro de exactamente qué agregar a mi código si la camera frontal está siendo utilizada.

/************************************************************************** DEVICE ORIENTATION DID CHANGE **************************************************************************/ func deviceOrientationDidChange() { println("DEVICE ORIENTATION DID CHANGE CALLED") let orientation: UIDeviceOrientation = UIDevice.currentDevice().orientation //------ IGNORE THESE ORIENTATIONS ------ if orientation == UIDeviceOrientation.FaceUp || orientation == UIDeviceOrientation.FaceDown || orientation == UIDeviceOrientation.Unknown || orientation == UIDeviceOrientation.PortraitUpsideDown || self.currentOrientation == orientation { println("device orientation does not need to change --- returning...") return } self.currentOrientation = orientation //------ APPLY A ROTATION USING THE STANDARD ROTATION TRANSFORMATION MATRIX in R3 ------ /* xyz --- --- x | cosø sinø 0 | y | -sinø consø 0 | z | 0 0 1 | --- --- */ //----- PERFORM BUTTON AND VIDEO DATA BUFFER ROTATIONS ------ switch orientation { case UIDeviceOrientation.Portrait: rotateButtons(self.degrees0) if self.usingFrontCamera == true { } else { } println("Device Orientation Portrait") break case UIDeviceOrientation.LandscapeLeft: println("Device Orientation LandScapeLeft") rotateButtons(self.degrees90) if self.usingFrontCamera == true { println("Using front camera, rotation in landscape left") // if let connection = self.captureConnection { // // connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight // // println("Capture connection Orientation is LandScape Right") // } // else { // // println("Capture connection is nil, could not change video orientation") // } } else { if let connection = self.captureConnection { connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight println("Capture connection Orientation is LandScape Right") } else { println("Capture connection is nil, could not change video orientation") } } break case UIDeviceOrientation.LandscapeRight: println("Device Orientation LandscapeRight") rotateButtons(-self.degrees90) if self.usingFrontCamera == true { println("Using front camera, rotation in landscape right") // if let connection = self.captureConnection { // // connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight // // println("Capture connection Orientation is LandScape Left") // } // else { // // println("Capture connection is nil, could not change video orientation") // } } else { if let connection = self.captureConnection { connection.videoOrientation = AVCaptureVideoOrientation.LandscapeLeft println("Capture connection Orientation is LandScape Left") } else { println("Capture connection is nil, could not change video orientation") } } break default: break } } 

Basado en esta respuesta: Video Guardando en la orientación incorrecta AVCaptureSession

Tuve el mismo problema y pude solucionarlo después de esta publicación.

     var videoConexión: AVCaptureConnection? 

for connection in self.fileOutput.connections { for port in connection.inputPorts! { if port.mediaType == AVMediaTypeVideo { videoConnection = connection as? AVCaptureConnection if videoConnection!.supportsVideoMirroring { videoConnection!.videoMirronetworking = true } } } }

Por favor, hágamelo saber si le ayuda a James

La respuesta aceptada solo reflejará el video en la vista previa. Necesitas transformar tu video.

  func mirrorVideo(inputURL: URL, completion: @escaping (_ outputURL : URL?) -> ()) { let videoAsset: AVAsset = AVAsset( url: inputURL ) let clipVideoTrack = videoAsset.tracks( withMediaType: AVMediaType.video ).first! as AVAssetTrack let composition = AVMutableComposition() composition.addMutableTrack(withMediaType: AVMediaType.video, prefernetworkingTrackID: CMPersistentTrackID()) let videoComposition = AVMutableVideoComposition() videoComposition.renderSize = CGSize(width: clipVideoTrack.naturalSize.height, height: clipVideoTrack.naturalSize.width) videoComposition.frameDuration = CMTimeMake(1, 30) let transformer = AVMutableVideoCompositionLayerInstruction(assetTrack: clipVideoTrack) let instruction = AVMutableVideoCompositionInstruction() instruction.timeRange = CMTimeRangeMake(kCMTimeZero, CMTimeMakeWithSeconds(60, 30)) var transform:CGAffineTransform = CGAffineTransform(scaleX: -1.0, y: 1.0) transform = transform.translatedBy(x: -clipVideoTrack.naturalSize.width, y: 0.0) transform = transform.rotated(by: CGFloat(Double.pi/2)) transform = transform.translatedBy(x: 0.0, y: -clipVideoTrack.naturalSize.width) transformer.setTransform(transform, at: kCMTimeZero) instruction.layerInstructions = [transformer] videoComposition.instructions = [instruction] // Export let exportSession = AVAssetExportSession(asset: videoAsset, presetName: AVAssetExportPreset640x480)! let fileName = UniqueIDGenerator.generate().appending(".mp4") let filePath = documentsURL.appendingPathComponent(fileName) let croppedOutputFileUrl = filePath exportSession.outputURL = croppedOutputFileUrl exportSession.outputFileType = AVFileType.mp4 exportSession.videoComposition = videoComposition exportSession.exportAsynchronously { if exportSession.status == .completed { DispatchQueue.main.async(execute: { completion(croppedOutputFileUrl) }) return } else if exportSession.status == .failed { print("Export failed - \(String(describing: exportSession.error))") } completion(nil) return } } 

En tu AVCaptureFileOutputRecordingDelegate

  func fileOutput(_ output: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Error?) { self.mirrorVideo(inputURL: outputFileURL) { (url) in self.delegate!.videoRecordingEnded(videoURL: url!) } }