3

簡単な質問です。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で間違っていることについて何か提案はありますか?

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

4

0 に答える 0