我遇到了一个非常有趣的例子,我非常好奇地重现。 有一个很棒的应用程序,我喜欢使用: 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示例代码,简化,没有任何音频和电影输出。只是视频输入设备和静态图像捕捉。
伙计们,拜托,你能给我一些表现建议吗?如何在加载相机会话时实现一些高性能? 任何帮助将受到高度赞赏!