非常に興味深い例に遭遇したので、再現したいと思っています。私がよく使っている素晴らしいアプリがあります: 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 サンプル コードを使用しており、オーディオとムービーの出力はなく、簡略化されています。ビデオ入力デバイスと静止画像のキャプチャだけです。
皆さん、パフォーマンスのアドバイスをお願いできますか? カメラセッションの読み込みで高いパフォーマンスを達成するにはどうすればよいですか? どんな助けでも大歓迎です!