video保存方向错误AVCaptureSession

我试图录制video(不显示相机)并保存。 但是保存的video并没有保存在正确的方向。 我试过迫使UIViewController是一个确定的方向,但是没有帮助。 所有video都以纵向录制。 我的代码如下:

session = [[AVCaptureSession alloc] init]; [session beginConfiguration]; session.sessionPreset = AVCaptureSessionPresetHigh; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *cam in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) { if (cam.position == AVCaptureDevicePositionFront) device = cam; } NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if (!input) { // Handle the error appropriately. NSLog(@"ERROR: trying to open camera: %@", error); } AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectoryPath = [paths objectAtIndex:0]; NSString *outputpathofmovie = [[documentsDirectoryPath stringByAppendingPathComponent:@"RecordedVideo"] stringByAppendingString:@".mp4"]; outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie]; [self deleteTempVideos]; [session addInput:input]; [session addInput:audioInput]; [session commitConfiguration]; [session startRunning]; movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; NSLog(@"%@", movieFileOutput.connections); AVCaptureConnection *videoConnection = nil; for ( AVCaptureConnection *connection in [movieFileOutput connections] ) { NSLog(@"%@", connection); for ( AVCaptureInputPort *port in [connection inputPorts] ) { NSLog(@"%@", port); if ( [[port mediaType] isEqual:AVMediaTypeVideo] ) { videoConnection = connection; } } } if([videoConnection isVideoOrientationSupported]) // **Here it is, its always false** { [videoConnection setVideoOrientation:[[UIDevice currentDevice] orientation]]; } NSLog(@"%@", videoConnection); [session addOutput:movieFileOutput]; [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; 

事实certificate,在将会话添加到AVCaptureMovieFileOutput后,您必须将连接方向添加到会话中。

 session = [[AVCaptureSession alloc] init]; [session beginConfiguration]; session.sessionPreset = AVCaptureSessionPresetHigh; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; for (AVCaptureDevice *cam in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) { if (cam.position == AVCaptureDevicePositionFront) device = cam; } NSError *error = nil; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; if (!input) { // Handle the error appropriately. NSLog(@"ERROR: trying to open camera: %@", error); } AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; AVCaptureDeviceInput * audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectoryPath = [paths objectAtIndex:0]; NSString *outputpathofmovie = [[documentsDirectoryPath stringByAppendingPathComponent:@"RecordedVideo"] stringByAppendingString:@".mp4"]; outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie]; [self deleteTempVideos]; [session addInput:input]; [session addInput:audioInput]; [session commitConfiguration]; [session startRunning]; movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; [session addOutput:movieFileOutput]; AVCaptureConnection *videoConnection = nil; for ( AVCaptureConnection *connection in [movieFileOutput connections] ) { NSLog(@"%@", connection); for ( AVCaptureInputPort *port in [connection inputPorts] ) { NSLog(@"%@", port); if ( [[port mediaType] isEqual:AVMediaTypeVideo] ) { videoConnection = connection; } } } if([videoConnection isVideoOrientationSupported]) // **Here it is, its always false** { [videoConnection setVideoOrientation:[[UIDevice currentDevice] orientation]]; } [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; 

**

在开始录制之前尝试改变其方向。

**

  if let videoConnection = fileOutput!.connectionWithMediaType(AVMediaTypeVideo) { var newOrientation: AVCaptureVideoOrientation? switch (UIDevice.currentDevice().orientation) { case .Portrait: newOrientation = .Portrait break case .PortraitUpsideDown: newOrientation = .PortraitUpsideDown break case .LandscapeLeft: newOrientation = .LandscapeRight break case .LandscapeRight: newOrientation = .LandscapeLeft break default : newOrientation = .Portrait break } self.fileOutput.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = newOrientation! self.fileOutput.startRecordingToOutputFileURL(NSURL(fileURLWithPath: filePath!), recordingDelegate: self) } 

在那里

 var fileOutput : AVCaptureMovieFileOutput! 

尝试这样的事情:

 #import <AVFoundation/AVFoundation.h> AVCaptureConnection *captureConnection = <#A capture connection#>; if ([captureConnection isVideoOrientationSupported]) { AVCaptureVideoOrientation orientation = AVCaptureVideoOrientationLandscapeLeft; [captureConnection setVideoOrientation:orientation]; } 

http://developer.apple.com/library/ios/#qa/qa1744/_index.html#//apple_ref/doc/uid/DTS40011134

谢谢Destiny Dawn,任何人都在寻找Xamarin ios的代码:

 AVCaptureConnection videoConnection = null; foreach(AVCaptureConnection connection in _videoOutput.Connections) { foreach ( AVCaptureInputPort port in connection.InputPorts) { if (port.MediaType == AVMediaType.Video) { videoConnection = connection; break; } } } if (videoConnection != null) { if (videoConnection.SupportsVideoOrientation) { videoConnection.VideoOrientation = AVCaptureVideoOrientation.LandscapeRight; } }