2014-04-09 74 views
6

我試圖捕捉到關於iPhone 5S最高分辨率(AVCaptureSessionPresetPhoto)多張照片。我試着用下面的代碼: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); 
} 

使用此代碼,我可以得到約每秒2張,沒辦法接近的原生相機應用的突發模式性能。我究竟做錯了什麼?我也嘗試使用上面的代碼沒有信號,但在這種情況下,我是有怪異的行爲,一些照片人失蹤(img0.png img1.png img3.png會存在,但img2.png會丟失)。使用第二種方法,性能會更好,但仍不能與原生應用程序的性能保持一致(在我的測試中,相機應用程序每秒可拍攝約8.4張照片)。

回答

13

captureStillImageAsynchronouslyFromConnection:completionHandler:不,我相信,蘋果公司正在使用它的連拍模式。

取而代之的是,蘋果公司以全分辨率(5秒支持)抓取視頻幀 * 。具體方法如下:

的AVCaptureDevice有activeFormat一套完整的傳感器分辨率,那麼你搶和處理每秒10幀從AVCaptureVideoDataOutputSampleBufferDelegatecaptureOutput:didOutputSampleBuffer:fromConnection:,發射了每個幀抓取快門聲。

你需要有一個回退爲不以全傳感器尺寸支持視頻設備的分辨率和/或如果你想支持(無論是分辨率較低的圖像或較慢的突發模式)比iOS 7.x更老的東西。

注意,你不能有captureStillImageAsynchronouslyFromConnection:completionHandler:多個併發的使用沒有一些非常意外的結果。這就是爲什麼你應該調用從前一個的completionHandler(其本質上,就是你的信號量在做什麼)的每個迭代。另外,您可能希望從PNG切換爲突發文件的文件格式 - 節省非常緩慢並需要大量系統資源 - 堆疊15或20個PNG可能會導致嚴重的悲傷!

* 這是可能是這樣做,因爲它當然可能使用私有API來實現相同的最終結果。

+0

我不是尋找一個準確的問題,但我想知道爲什麼有些捕獲格式爲「全屏幕「,以及爲什麼有些人有不同比例(4:3 vs 16:9)......這似乎與圖像穩定有關,這就解釋了爲什麼'AVCaptureSessionPresetPhoto'沒有這個問題。 (https://www.iphonelife.com/blog/87/why-you-may-want-disable-image-stabilization-during-video-recording)。看起來合乎邏輯的是,在突發模式下,圖像穩定也不被使用... – Vinzzz

+0

唯一的16:9格式是那些HD,根據定義它是16:9格式。其他的都是全畫幅,IIRC。 'AVCaptureSessionPresetPhoto'不能用於拍攝視頻,但是您可以*在適當的硬件上以相同的分辨率拍攝視頻,方法是手動設置「activeFormat」,而不是使用預設。使用iOS 7.x時,預設值非常可選。 – Wildaker

+0

哪一種說法是相同的:)傳感器是4:3,所以任何不是4:3的輸出格式實際上都會從傳感器獲取數據。在16的情況下:9的格式,從傳感器的額外的像素可以被用來做一些圖像穩定,並且該特徵('AVCaptureConnection enablesVideoStabilizationWhenAvailable')實際上只是可用於16:9的格式。關於'activeFormat',你手動設置的一個必須是'-AVcaptureDevice格式' – Vinzzz

1

在使用iOS 8的這種方法對於突發模式及以上:

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

Documentation

+0

這個用於暴露括號,而不是突發捕獲。有關曝光包圍的介紹,請參閱http://www.digital-photo-secrets.com/tip/2111/what-is-exposure-bracketing/。 – pjh68

+0

如果你不改變設置,那麼它可以爲每張照片使用相同的設置,並且是推薦的方式 – d0n13