2014-04-09 18 views
6

Tôi đang cố gắng chụp nhiều ảnh ở độ phân giải cao nhất (AVCaptureSessionPresetPhoto) trên iPhone 5s. Tôi đã thử sử dụng mã sau:chế độ chụp ảnh ios/iphone api

dispatch_semaphore_t sync = dispatch_semaphore_create(0); 
while([self isBurstModeEnabled] == YES) 
       { 
     [stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) 
          { 

           if (imageSampleBuffer != NULL) 
           { 
            NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
            NSString *videoThumbPath = [NSString 
                   stringWithFormat:@"%@/img%d.png", 
                   burstFolderPath, 
                   index]; 

            [imageData writeToFile:videoThumbPath atomically:YES]; 
            if(0 == index) 
            { 
             [self NSLogPrint:[NSString stringWithFormat:@"Created photo at %@",videoThumbPath]]; 
            } 
           } 
           dispatch_semaphore_signal(sync); 
          }]; 
    dispatch_semaphore_wait(sync, DISPATCH_TIME_FOREVER); 
} 

Sử dụng mã này Tôi có thể nhận khoảng 2 ảnh mỗi giây, không cách nào gần hiệu suất của chế độ chụp liên tục của ứng dụng máy ảnh gốc. Tôi đang làm gì sai? Ngoài ra tôi đã thử sử dụng mã ở trên mà không có semaphore, nhưng trong trường hợp đó tôi đã có hành vi kỳ lạ, một số hình ảnh bị mất (img0.png img1.png img3.png sẽ có mặt nhưng img2.png sẽ bị thiếu). Sử dụng phương pháp thứ hai hiệu suất sẽ tốt hơn nhưng vẫn không ngang bằng với hiệu suất ứng dụng gốc (trong các thử nghiệm của tôi, ứng dụng máy ảnh sẽ tạo ra khoảng 8,4 ảnh mỗi giây).

Trả lời

13

captureStillImageAsynchronouslyFromConnection:completionHandler: không phải là, tôi tin rằng, những gì Apple đang sử dụng cho chế độ chụp liên tục.

Thay vào đó, Apple là * lấy khung hình video ở độ phân giải đầy đủ (được hỗ trợ bởi 5s). Dưới đây là cách thực hiện:

AVCaptureDevice có độ phân giải cảm biến đầy đủ, sau đó bạn lấy và xử lý 10 khung hình/giây từ AVCaptureVideoDataOutputSampleBufferDelegate 's captureOutput:didOutputSampleBuffer:fromConnection:, tắt âm thanh màn trập cho mỗi lần chụp khung.

Bạn sẽ cần phải có hình ảnh thu nhỏ (hình ảnh có độ phân giải thấp hơn hoặc chế độ chụp chậm hơn) cho các thiết bị không hỗ trợ video ở độ phân giải đầy đủ cảm biến — và/hoặc nếu bạn muốn hỗ trợ mọi thứ cũ hơn iOS 7.x.

Lưu ý rằng bạn không thể sử dụng đồng thời captureStillImageAsynchronouslyFromConnection:completionHandler: mà không có một số kết quả cực kỳ bất ngờ. Đây là lý do tại sao bạn nên gọi mỗi lần lặp lại từ completionHandler trước đó (về bản chất, đó là những gì mà semaphore của bạn đang làm). Ngoài ra, bạn có thể muốn chuyển đổi từ PNG thành định dạng tệp cho ảnh chụp liên tiếp — nó tiết kiệm rất chậm và đòi hỏi nhiều tài nguyên hệ thống — xếp chồng lên 15 hoặc 20 PNG có thể khiến bạn đau buồn nghiêm trọng!

* Đó là có thể là làm điều này, bởi vì tất nhiên, có thể sử dụng API riêng để đạt được kết quả cuối cùng.

+0

tôi đã không tìm kiếm mà vấn đề chính xác, nhưng tôi đã tự hỏi tại sao một số định dạng chụp là 'full- màn hình ', và lý do tại sao một số có tỷ lệ khác nhau (4: 3 so với 16: 9) ... Điều này dường như liên quan đến Ổn định hình ảnh, và điều đó giải thích tại sao 'AVCaptureSessionPresetPhoto' không có vấn đề này. (https://www.iphonelife.com/blog/87/why-you-may-want-disable-image-stabilization-during-video-recording). Nó có vẻ hợp lý rằng trong chế độ chụp, Ổn định hình ảnh không được sử dụng ... – Vinzzz

+0

Chỉ có định dạng 16: 9 là những định dạng HD, có định dạng 16: 9 theo định nghĩa. Những người khác đều là full-frame, IIRC. Không thể sử dụng 'AVCaptureSessionPresetPhoto' để quay video, nhưng bạn * có thể *, trên phần cứng phù hợp, quay video ở cùng độ phân giải bằng cách đặt' activeFormat' theo cách thủ công, không sử dụng giá trị đặt trước. Với iOS 7.x, các cài đặt trước rất tùy chọn. – Wildaker

+0

Đó là cách khác để nói giống nhau :) Cảm biến là 4: 3, vì vậy bất kỳ định dạng đầu ra nào không phải là 4: 3 thực sự tạo ra dữ liệu từ cảm biến. Trong trường hợp định dạng 16: 9, các pixel phụ từ cảm biến có thể được sử dụng để thực hiện một số Ổn định hình ảnh và tính năng này ('AVCaptureConnection enableVideoStabilizationWhenAvailable') thực tế chỉ có sẵn cho các định dạng 16: 9.Về 'activeFormat', cái bạn đặt thủ công phải là một trong' -AVcaptureDevice formats' – Vinzzz

1

Sử dụng phương pháp này cho chế độ chụp trong iOS 8 trở lên:

- (void)captureStillImageBracketAsynchronouslyFromConnection:(AVCaptureConnection *)connection withSettingsArray:(NSArray *)settings completionHandler:(void (^)(CMSampleBufferRef sampleBuffer, AVCaptureBracketedStillImageSettings *stillImageSettings, NSError *error))handler NS_AVAILABLE_IOS(8_0); 

Documentation

+0

Điều này cho các dấu ngoặc, không chụp liên tục. Xem http://www.digital-photo-secrets.com/tip/2111/what-is-exposure-bracketing/ để biết giới thiệu về cách phơi sáng. – pjh68

+0

Nếu bạn không thay đổi cài đặt, nó có thể sử dụng cùng một cài đặt cho mỗi ảnh và là cách được khuyến nghị – d0n13

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