2010-08-03 31 views
13

Tôi đang cố gắng mô phỏng hoạt ảnh được thấy trong ứng dụng máy ảnh mặc định, nơi ảnh chụp nhanh của kính ngắm máy ảnh được làm động vào góc màn hình ứng dụng.AVCaptureVideoPreviewLayer: chụp nhanh

Các AVCaptureVideoPreviewLayer đối tượng nắm giữ chìa khóa để giải quyết vấn đề này không phải là rất cởi mở đối với các yêu cầu: cố gắng để tạo ra một bản sao của nó trong một lớp mới với ..

- (id)initWithLayer:(id)layer 

.. trả về một sản phẩm nào lớp, không có ảnh chụp nhanh, vì vậy rõ ràng có một số ma thuật sâu hơn đang diễn ra ở đây.

Đầu mối/boos của bạn được chào đón nhiều nhất.

M.

Trả lời

22

đối mặt với cùng một tai ương, từ một góc hơi khác.

Dưới đây là giải pháp khả thi, mà không là quá lớn IMO:

  • Bạn có thể thêm vào một AVCaptureSession cả một AVCaptureStillImageOutput và một AVCaptureVideoDataOutput. Khi bạn đặt phiênPreset thành AVCaptureSessionPresetHigh bạn sẽ bắt đầu nhận được khung của API và khi bạn chuyển sang AVCaptureSessionPresetPhoto bạn có thể chụp những hình ảnh thực. Vì vậy, ngay trước khi chụp ảnh, bạn có thể chuyển sang video, tải khung hình và sau đó quay lại máy ảnh. Điều quan trọng là phải mất một thời gian "dài" (vài giây) để máy ảnh chuyển đổi giữa máy quay video và máy ảnh.

  • Một lựa chọn khác sẽ được sử dụng duy nhất sản lượng camera (AVCaptureStillImageOutput), và sử dụng UIGetScreenImage để có được ảnh chụp màn hình của điện thoại. Sau đó, bạn có thể cắt các điều khiển và chỉ để lại hình ảnh. Điều này trở nên phức tạp nếu bạn đang hiển thị các điều khiển giao diện người dùng trên hình ảnh. Ngoài ra, theo this bài đăng, Apple bắt đầu từ chối các ứng dụng sử dụng chức năng này (nó luôn luôn là iffy).

  • Ngoài những điều này, tôi cũng đã thử chơi với AVCaptureVideoPreviewLayer. Có this bài đăng để lưu UIView hoặc CALayer vào UIImage. Nhưng tất cả đều tạo ra hình ảnh rõ ràng hoặc trắng. Tôi đã thử truy cập lớp, lớp của chế độ xem, lớp siêu hình , presentationLayer, modelLayer, nhưng không có kết quả. Tôi đoán dữ liệu trong AVCaptureVideoPreviewLayer rất nội bộ và không thực sự là một phần của cơ sở hạ tầng lớp thông thường.

Hy vọng điều này sẽ giúp, Đã thêm.

+0

cái nào tốt hơn @Oded Ben Dov trong ba điều trên. Đưa ra gợi ý tốt nhất \ –

0

có 2 cách để lấy khung xem trước .. AVCaptureVideoDataOutput & AVCaptureStillImageOutput :)

là phiên chụp của bạn được thiết lập để lấy khung hình video, sau đó làm cho lớp của bạn với cgimage từ một khung chọn.nếu nó được thiết lập cho ảnh tĩnh, hãy chờ cho đến khi nhận được hình ảnh tĩnh của bạn và làm cho lớp của bạn từ một phiên bản thu nhỏ của cgimage đó. nếu bạn chưa có đầu ra cho phiên của mình, bạn sẽ phải thêm một cái tôi nghĩ.

5

Tôi nghĩ bạn nên thêm một AVCaptureVideoDataOutput với phiên hiện tại với:

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); 

Sau đó, thực hiện các phương pháp đại biểu dưới đây để nhận được bản chụp hình ảnh của bạn:

- (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; 
    }); 
} 

này sẽ tiêu thụ bộ nhớ và giảm hiệu suất của ứng dụng. Để cải thiện, bạn cũng có thể tối ưu hóa của bạn AVCaptureVideoDataOutput với:

videoOutput.minFrameDuration = CMTimeMake(1, 15); 

Bạn cũng có thể sử dụng alwaysDiscardsLateVideoFrames.

+0

Ghi chú nhỏ: 'alwaysDiscardsLateVideoFrames' là' true' theo mặc định – xaphod

-7

Bắt đầu từ iOS 7, bạn có thể sử dụng UIView::snapshotViewAfterScreenUpdates để chụp nhanh UIView gói AVCaptureVideoPreviewLayer của bạn. Điều này không giống như UIGetScreenImage, điều này sẽ khiến ứng dụng của bạn bị từ chối.

UIView *snapshot = [self.containerView snapshotViewAfterScreenUpdates:YES]; 

Gọi lại cách cũ để biến chế độ xem thành hình ảnh. Vì lý do nào đó, nó hoạt động trên mọi thứ ngoại trừ xem trước máy ảnh:

UIGraphicsBeginImageContextWithOptions(self.containerView.bounds.size, NO, [UIScreen mainScreen].scale); 
[self.containerView drawViewHierarchyInRect:self.containerView.bounds afterScreenUpdates:YES]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+3

snapshotViewAfterScreenUpdates: không hoạt động trên AVCaptureVideoPreviewLayer. –

+0

Rất khó chịu rằng điều này đã được đăng, nó không hoạt động trên một AVCaptureVideoPreviewLayer, chỉ lãng phí thời gian –

Các vấn đề liên quan