2

AvCam を使用してカスタム カメラを作成しようとしている iOS は初めてです。横向きのプレビューを取得するのに問題があります。ビューが時計回りに 90 度回転し、半分の画面に表示されます。

このメッセージが表示されます --

警告: -[ setOrientation:] は非推奨です。

AVCaptureConnection の -setVideoOrientation を使用してください:

AVCaptureConnection は既に方向を設定しているため、他に何を想定しているのかわかりません。

この質問は、以前のバージョンの iOS (4,5) で何度も尋ねられたことを知っていますが、これらの手法/コードはどれもうまくいきませんでした (iOS 6)。

元のコード (Apple からの変更はありません)

if ([self captureManager] == nil) {
    AVCamCaptureManager *manager = [[AVCamCaptureManager alloc] init];
    [self setCaptureManager:manager];
    [manager release];

    [[self captureManager] setDelegate:self];

    if ([[self captureManager] setupSession]) {
        // Create video preview layer and add it to the UI
        AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]];


        UIView *view = [self videoPreviewView];
        CALayer *viewLayer = [view layer];
        [viewLayer setMasksToBounds:YES];

        CGRect bounds = [view bounds];
        [newCaptureVideoPreviewLayer setFrame:bounds];

        if ([newCaptureVideoPreviewLayer isOrientationSupported]) {
            [newCaptureVideoPreviewLayer setOrientation:AVCaptureVideoOrientationPortrait];
        }



        [newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

        [viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];

        [self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer];

AVCaptureConnection チャンク:

-(void)startRecordingWithOrientation:(AVCaptureVideoOrientation)videoOrientation; {
AVCaptureConnection *videoConnection = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self movieFileOutput] connections]];
if ([videoConnection isVideoOrientationSupported])
    [videoConnection setVideoOrientation:videoOrientation];

[[self movieFileOutput] startRecordingToOutputFileURL:[self outputFileURL] recordingDelegate:self];

}

4

2 に答える 2

3

前回、私もこの問題に出くわしました。私は2つのことをすることでこの問題を解決しました

  1. 正しい向きを取得
    する

    if ([newCaptureVideoPreviewLayer isOrientationSupported]) {
        [newCaptureVideoPreviewLayer setOrientation:AVCaptureVideoOrientationPortrait];
    }  
    

    if ([newCaptureVideoPreviewLayer.connection isVideoOrientationSupported]) {  
        [newCaptureVideoPreviewLayer.connection setVideoOrientation:[UIDevice currentDevice].orientation];
    }
    
  2. 初期化中にビデオの向きを強制的に更新して、横向きモードでビデオ出力をキャッチするには - (void)deviceOrientationDidChangeAVCaptureManager.m

    私はそれを追加しました:

    - (BOOL) setupSession
    {
        BOOL success = NO;
    
        ...
    
        AVCamRecorder *newRecorder = [[AVCamRecorder alloc] initWithSession:[self session] outputFileURL:self.lastOutputfileURL];
        [newRecorder setDelegate:self];
    
        [self performSelector:@selector(deviceOrientationDidChange)];
    
        ...
    
        return success;
    }
    
于 2013-08-05T10:44:29.767 に答える
0

したがって、ここに回避策がありますが、これよりも優れた解決策があるはずです。この質問からコードの一部を取得しました:

iPhone アプリ - ランドスケープ モードで AVFoundation ビデオを表示する

ただし、iOS6 で動作させるには、すべての向きに合わせてフレームを調整する必要がありました (それでも警告が表示されます)。


-(void)willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

[CATransaction begin];
if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft){
    captureVideoPreviewLayer.orientation = UIInterfaceOrientationLandscapeLeft;
    captureVideoPreviewLayer.frame = CGRectMake(0, 0, 480, 320);

} else if (toInterfaceOrientation==UIInterfaceOrientationPortrait){
    captureVideoPreviewLayer.orientation = UIInterfaceOrientationPortrait;
    captureVideoPreviewLayer.frame = CGRectMake(0, 0, 320, 480);

} else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight){
    captureVideoPreviewLayer.orientation = UIInterfaceOrientationLandscapeRight;
    captureVideoPreviewLayer.frame = CGRectMake(0, 0, 480, 320);

}
[CATransaction commit];
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

}

于 2012-10-19T18:46:04.577 に答える