2

我遇到了一个非常有趣的例子,我很想复制它。有一个我非常喜欢的很棒的应用程序: https ://itunes.apple.com/en/app/oldbooth/id298007500?mt=8

我不是广告,因为我不是作者。现在他们有一个有趣的点,当从一个表格视图中,通过选择一个拇指,一个带有视频会话的 ViewController 被加载。我注意到了什么:

1)视频会话屏幕的加载速度非常快,几乎没有等待。

2) 不存在 UIImagePicker 快门动画

3)VC外观动画看起来像“pushVC”,我的意思是它是水平的

4)带有预览的视图首先是白色的,然后带有 alpha 动画它变为 0 alpha。

我有一些使用 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 应用程序中,它首先加载屏幕,然后释放白色视图的 alpha(我猜它只是封面视图,延迟后开始丢失 alfa)。就我而言,它在加载 VC 之前仍然需要考虑一段时间。时间(1.5秒)是一样的,但是等待不是那么友好。

如果我将所有加载代码放在 didAppear 中,它会立即加载,但是加载,所以点击和准备视频之间的总时间增加到 2.5 秒,这不好。

如果我将加载代码放在 willAppear 中,它的工作方式与第一种情况相同,当它首先想到时,加载(总共 1.5 秒)......

PS 我使用来自 Apple 的 AVCamDemoCaptureManager 示例代码,经过简化,没有任何音频和电影输出。只是视频输入设备和静止图像捕获。

伙计们,请给我一些性能建议吗?如何在加载相机会话时实现一些高性能?任何帮助将不胜感激!

4

0 回答 0