簡単な質問です。iPhone を縦向きから横向きに、またはその逆に回転させたときに、AVCaptureVideoPreviewLayer の向きを変更するにはどうすればよいですか。
この質問は何度も聞かれていることは知っていますが、最初に遭遇したのは私ではありませんが、グーグルまたは見つけた利用可能なすべての解決策を試しましたが、それでもうまくいきません.
AVCapture をセットアップするために実装したコードは次のとおりです。ご覧のとおり、向きの変化を監視しています
-(IBAction)InitiateCamera
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
//APPLE CODE
NSError *error = nil;
// Create the session
session = [[AVCaptureSession alloc] init];
// Configure the session to produce lower resolution video frames, if your
// processing algorithm can cope. We'll specify medium quality for the
// chosen device.
session.sessionPreset = AVCaptureSessionPresetLow;
// Find a suitable AVCaptureDevice
device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
// Create a device input with the device and add it to the session.
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device
error:&error];
if (!input) {
// Handling the error appropriately.
}
[session addInput:input];
// Create a VideoDataOutput and add it to the session
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[session addOutput:output];
// Configure your output.
dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
[output setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
// Specify the pixel format
output.videoSettings =
[NSDictionary dictionaryWithObject:
[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]
forKey:(id)kCVPixelBufferPixelFormatTypeKey];
// If you wish to cap the frame rate to a known value, such as 15 fps, set
// minFrameDuration.
output.minFrameDuration = CMTimeMake(1, 15);
avLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
CGRect bounds=self.view.layer.bounds;
avLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
avLayer.bounds=bounds;
avLayer.position=CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
//avLayer.backgroundColor = [[UIColor blackColor] CGColor];
[self.view.layer insertSublayer:avLayer atIndex:1];
// Start the session running to start the flow of data
[session startRunning];
// Assign session to an ivar.
[self setSession:session];
}
この投稿を回答として使用して、AVCapture ビューの向きを変更しようとしました iOS CAlayer Orientation AVCaptureVideoPreviewLayer does not rotate
- (void) orientationChanged:(NSNotification *)notification
{
[self rotateLayer];
}
-(void)rotateLayer
{
CGRect layerRect = [[[self view] layer] bounds];
UIDeviceOrientation orientation =[[UIDevice currentDevice]orientation];
switch (orientation) {
case UIDeviceOrientationLandscapeLeft:
avLayer.affineTransform = CGAffineTransformMakeRotation(M_PI+ M_PI_2); // 270 degress
break;
case UIDeviceOrientationLandscapeRight:
avLayer.affineTransform = CGAffineTransformMakeRotation(M_PI_2); // 90 degrees
break;
case UIDeviceOrientationPortraitUpsideDown:
avLayer.affineTransform = CGAffineTransformMakeRotation(M_PI); // 180 degrees
break;
default:
avLayer.affineTransform = CGAffineTransformMakeRotation(0.0);
[avLayer setBounds:layerRect];
break;
}
[avLayer setPosition:CGPointMake(CGRectGetMidX(layerRect),CGRectGetMidY(layerRect))];
}
問題は、スクリーンショットを見るとわかるように、最初はすべてが正しく表示されますが、デバイスを回転させた後、AVCapture ビューがすべて表示されないことです。私がrotateLayerで間違っていることについて何か提案はありますか?