Probleme mit AVCaptureSession im Querformat auf dem iPad
-
27-12-2019 - |
Frage
Ich habe versucht, Bilder von der Frontkamera aufzunehmen und sie in der Ansicht darzustellen.Hier ist mein Code
_session = [[AVCaptureSession alloc] init];
_session.sessionPreset = AVCaptureSessionPreset640x480;
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error];
if (deviceInput) {
[_session addInput:deviceInput];
}
else {
DDLogInfo(@"Some wierd shit happened");
return;
}
// Session output
/*
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[_session addOutput:output];
output.metadataObjectTypes = @[AVMetadataObjectTypeFace];
AVCaptureConnection *connection = [output connectionWithMediaType:AVMediaTypeMetadata];
connection.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
*/
// Session output
AVCaptureMovieFileOutput *videoOutput = [[AVCaptureMovieFileOutput alloc] init];
[_session addOutput:videoOutput];
AVCaptureConnection *connection = [videoOutput connectionWithMediaType:AVMediaTypeVideo];
connection.videoOrientation = AVCaptureVideoOrientationPortrait;
// Preview layer
_previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_previewLayer.frame = CGRectMake(0, 0, self.middleView.frame.size.width, self.middleView.frame.size.height);
[self.middleView.layer addSublayer:_previewLayer];
[_session startRunning];
Das Problem dabei ist, dass die Bilder auf der Präsentationsebene im Querformat meines iPad um 90 Grad gedreht sind.Wie kann ich das beheben?Ich habe den Stapelüberlauf durchsucht und versucht, etwas damit zu tun AVCaptureConnection
, aber leider ohne Erfolg.
Lösung
Es wurde gelöst, jetzt funktioniert es in allen Ausrichtungen.Das müssen wir einstellen
_previewLayer.connection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation];
wobei die Methode lautet:
- (AVCaptureVideoOrientation) videoOrientationFromCurrentDeviceOrientation {
switch (self.interfaceOrientation) {
case UIInterfaceOrientationPortrait: {
return AVCaptureVideoOrientationPortrait;
}
case UIInterfaceOrientationLandscapeLeft: {
return AVCaptureVideoOrientationLandscapeLeft;
}
case UIInterfaceOrientationLandscapeRight: {
return AVCaptureVideoOrientationLandscapeRight;
}
case UIInterfaceOrientationPortraitUpsideDown: {
return AVCaptureVideoOrientationPortraitUpsideDown;
}
}
}
Außerdem müssen wir für die Capture-Ausgabe Folgendes festlegen:
AVCaptureConnection *output2VideoConnection = [videoOutput connectionWithMediaType:AVMediaTypeVideo];
output2VideoConnection.videoOrientation = [self videoOrientationFromCurrentDeviceOrientation];
Andere Tipps
In Schnell 3:
Zuerst müssen wir einstellen previewLayer.connection.videoOrientation
wie MegaManX
previewLayer.connection.videoOrientation = self.videoOrientationFromCurrentDeviceOrientation()
wobei die Methode lautet:
func videoOrientationFromCurrentDeviceOrientation() -> AVCaptureVideoOrientation {
switch UIApplication.shared.statusBarOrientation {
case .portrait:
return AVCaptureVideoOrientation.portrait
case .landscapeLeft:
return AVCaptureVideoOrientation.landscapeLeft
case .landscapeRight:
return AVCaptureVideoOrientation.landscapeRight
case .portraitUpsideDown:
return AVCaptureVideoOrientation.portraitUpsideDown
default:
// Can this happen?
return AVCaptureVideoOrientation.portrait
}
}
Dann müssen wir uns auch darum kümmern videoOrientation
wenn der Benutzer das Gerät dreht (Methode stammt von Hier)
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in
self.previewLayer.connection.videoOrientation = self.videoOrientationFromCurrentDeviceOrientation()
}, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
// Finish Rotation
})
super.viewWillTransition(to: size, with: coordinator)
}