快速加载AVFoundation视频会话

时间:2012-12-26 15:34:55

标签: ios performance avfoundation avcapturesession

我遇到了一个非常有趣的例子,我非常好奇地重现。 有一个很棒的应用程序,我喜欢使用: 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中,它会立即加载,但加载,所以tap和ready-video之间的总时间增加到2.5秒,这是不好的。

如果我把加载代码放在willAppear中,它的工作原理与第一种情况相同,当它第一次认为时,负载(总共1.5秒)......

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

伙计们,拜托,你能给我一些表现建议吗?如何在加载相机会话时实现一些高性能? 任何帮助将受到高度赞赏!

0 个答案:

没有答案