2

非常に興味深い例に遭遇したので、再現したいと思っています。私がよく使っている素晴らしいアプリがあります: https://itunes.apple.com/en/app/oldbooth/id298007500?mt=8

私は著者ではないので、宣伝はしません。ここで興味深い点があります。テーブル ビューから親指を選択すると、ビデオ セッションを含む ViewController が読み込まれます。私が気づいたこと:

1) ビデオ セッション画面の読み込みは非常に高速で、ほとんど待機しません。

2) UIImagePicker シャッター アニメーションが存在しない

3) VC の出現アニメーションは「pushVC」のように見えます。つまり、横になっています。

4) プレビュー付きのビューは最初は白で、アルファ アニメーションでは 0 アルファになります。

AVFoundation のビデオ キャプチャを使用した経験はありますが、それほど速くはありません。これは私にとって信じられないことであり、このレベルの速度が可能であることがわかりました。もちろん、私も同じ速度を望んでいます.どうすればそのようなレベルのパフォーマンスを達成できるかアドバイスをお願いできますか?

私は次のことを試みています:

親 VC では、didLoad で:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
    self.photoVC = [storyboard instantiateViewControllerWithIdentifier:@"PhotoCreationVC"];

    dispatch_async(queue, ^{    
        [self.photoVC configureFoundation];
    });

このメソッドは次のことを行います。

-(void) configureFoundation{
    NSError * error;
    _captureManager = [[AVCamDemoCaptureManager alloc] init];
    if ([_captureManager setupSessionWithPreset:AVCaptureSessionPresetHigh error:&error]) {
        [self setCaptureManager:_captureManager];
        _sessionEstablished = YES;
    } else {
        [Utils showMessage:[error localizedDescription] withTitle:@"Input Device Init Failed"];
    }

}

VC が didLoad を実行すると、次のようになります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (_sessionEstablished) {
        AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[_captureManager session]];
        UIView *view = self.previewView;
        CALayer *viewLayer = view.layer;
        CGRect bounds = view.bounds;

        [captureVideoPreviewLayer setFrame:bounds];

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

        [captureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

        self.captureVideoPreviewLayer = captureVideoPreviewLayer;


        if ([[_captureManager session] isRunning]) {

            [_captureManager setDelegate:self];

            NSUInteger cameraCount = [_captureManager cameraCount];
            if (cameraCount < 1) {
            } else if (cameraCount < 2) {
            }

            if (cameraCount < 1) {

            }

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


        } else {
            [Utils showMessage:@"Failed to start session." withTitle:@"Error"];
        }


    }

}

何が起こるか:iTunesアプリでは、最初に画面をロードし、次に白いビューのアルファを解放します(遅延後にアルファを失い始めるのは単なるカバービューだと思います). 私の場合、VC をロードする前にまだしばらく考えています。時間(1.5秒)は同じですが、待ち時間はそれほどフレンドリーではありません。

すべてのロード コードを didAppear に入れると、すぐにロードされますが、ロードされるため、タップと Ready-Video の間の合計時間が 2.5 秒に増加し、良くありません。

ロードコードをwillAppearに入れると、最初の状況と同じように機能し、最初に考えたとき、ロード(合計1.5秒)...

PS 私は Apple の AVCamDemoCaptureManager サンプル コードを使用しており、オーディオとムービーの出力はなく、簡略化されています。ビデオ入力デバイスと静止画像のキャプチャだけです。

皆さん、パフォーマンスのアドバイスをお願いできますか? カメラセッションの読み込みで高いパフォーマンスを達成するにはどうすればよいですか? どんな助けでも大歓迎です!

4

0 に答える 0