我試圖模擬在默認相機應用程序中看到的動畫,其中相機取景器的快照在應用程序顯示的角落中動畫化。AVCaptureVideoPreviewLayer:拍攝快照
持有的關鍵,解決這個問題的AVCaptureVideoPreviewLayer對象不是這些要求非常開放:試圖用一個新的圖層創建一個副本..
- (id)initWithLayer:(id)layer
..返回一個空層,沒有圖像快照,很顯然這裏有一些更深層次的魔法。
你的線索/噓聲是最受歡迎的。
M.
我試圖模擬在默認相機應用程序中看到的動畫,其中相機取景器的快照在應用程序顯示的角落中動畫化。AVCaptureVideoPreviewLayer:拍攝快照
持有的關鍵,解決這個問題的AVCaptureVideoPreviewLayer對象不是這些要求非常開放:試圖用一個新的圖層創建一個副本..
- (id)initWithLayer:(id)layer
..返回一個空層,沒有圖像快照,很顯然這裏有一些更深層次的魔法。
你的線索/噓聲是最受歡迎的。
M.
面臨着同樣的困境,從稍微不同的角度。
以下是可能的解決方案,這沒有太大IMO:
您可以添加到AVCaptureSession既是AVCaptureStillImageOutput和AVCaptureVideoDataOutput。當你設置sessionPreset到AVCaptureSessionPresetHigh你會開始通過API獲取幀,當你切換到AVCaptureSessionPresetPhoto你可以拍攝真實圖像。所以在拍攝照片之前,您可以切換到視頻,獲取相框,然後返回相機。需要注意的是,攝像機在攝像機和攝像機之間切換需要「很長」的時間(幾秒鐘)。
另一種選擇是隻使用攝像機輸出(AVCaptureStillImageOutput),並使用UIGetScreenImage拿到手機的屏幕截圖。然後,您可以裁剪控件並僅保留圖像。如果您在圖像上顯示UI控件,這會變得複雜。另外,根據this的帖子,蘋果開始拒絕使用這個功能的應用程序(它總是如此)。
除了這些,我也嘗試玩AVCaptureVideoPreviewLayer。有this後保存UIView或CALayer到UIImage。但它都會產生清晰或白色的圖像。我嘗試訪問圖層,視圖的圖層,超層,presentationLayer,modelLayer,但無濟於事。我猜想的數據AVCaptureVideoPreviewLayer是非常內部的,而不是真正的普通層基礎設施的一部分。
希望這會有所幫助, Oded。
有2種方式來獲取預覽幀.. AVCaptureVideoDataOutput & AVCaptureStillImageOutput :)
是您的捕獲會話建立搶到視頻幀,然後從選擇框的cgimage讓你的層。如果它被設置爲劇照,請等到獲得靜止圖像並從該cgimage的縮小版本製作圖層。如果你的會話還沒有輸出,你就不得不添加一個我認爲的。
我想你應該添加一個AVCaptureVideoDataOutput
當前會話:
AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init];
videoOutput.videoSettings = @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) };
[session addOutput:videoOutput];
dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL);
[videoOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
然後,執行下面的委託方法,讓您的圖像抓拍:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
// Add your code here that uses the image.
dispatch_async(dispatch_get_main_queue(), ^{
_imageView.image = image;
});
}
這會消耗內存和降低應用程序的性能。要提高,還可以優化您的AVCaptureVideoDataOutput
有:
videoOutput.minFrameDuration = CMTimeMake(1, 15);
您還可以使用alwaysDiscardsLateVideoFrames
。
小記:默認情況下,alwaysDiscardsLateVideoFrames爲true。 – xaphod 2017-09-27 00:16:02
從iOS 7開始,您可以使用UIView::snapshotViewAfterScreenUpdates快照包裝AVCaptureVideoPreviewLayer的UIView。這與UIGetScreenImage
不一樣,它會讓你的應用程序被拒絕。
UIView *snapshot = [self.containerView snapshotViewAfterScreenUpdates:YES];
回想一下將舊視角變成圖像的方式。由於某種原因,它除了相機預覽之外的一切工作:
UIGraphicsBeginImageContextWithOptions(self.containerView.bounds.size, NO, [UIScreen mainScreen].scale);
[self.containerView drawViewHierarchyInRect:self.containerView.bounds afterScreenUpdates:YES];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
snapshotViewAfterScreenUpdates:在AVCaptureVideoPreviewLayer上不起作用。 – 2016-03-24 08:17:47
非常煩人,這是張貼,它不適用於AVCaptureVideoPreviewLayer,只是浪費時間 – 2016-11-05 02:01:48
哪一個更好@Old本多夫在上述三。給出最好的建議\ – 2017-12-11 13:39:59