2016-01-21 186 views
4

我有一個視頻AVCaptureDeviceAVMediaTypeVideo),我正在使用setExposureTargetBias:completionHandler短暫減少曝光,然後再次恢復。 我需要知道captureOutput:didOutputSampleBuffer:fromConnection:中的哪個緩衝區對應於曝光量減少的第一幀。AVCaptureDevice:比較採樣緩衝時間戳

的文檔說:

塊接收該匹配所述第一緩衝器的所述設置已被應用到的時間戳。時間戳與設備時鐘同步,因此必須在與通過AVCaptureVideoDataOutput實例傳送的緩衝區時間戳進行比較之前轉換爲主時鐘。

https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureDevice_Class/#//apple_ref/occ/instm/AVCaptureDevice/setExposureTargetBias:completionHandler

如何獲得 「設備時鐘」? 我在completionHandler中做了以下工作,但主時鐘似乎與主時鐘一致。

CMClockRef masterClock = self.captureSession.masterClock; 
CMClockRef deviceClock = CMClockGetHostTimeClock(); 
syncTimeConverted = CMSyncConvertTime(syncTime, deviceClock, masterClock); 

我打算做中captureOutput:didOutputSampleBuffer:fromConnection:下面來測試一個緩衝區是否是一個我想

CMTime bufferTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 
bool isDroppedExposureFrame = CMTimeCompare(bufferTime, syncTimeConverted) == 0; 

我在正確的軌道上?

回答

1

AVCaptureSession.h,其中CMClockRef masterClock定義,我發現其在另一個方向上工作的解決方案:

例如,如果要以反轉輸出時間戳同步到原始時間戳,則可以做到以下幾點:

captureOutput:didOutputSampleBuffer:fromConnection:

AVCaptureInputPort *port = [[connection inputPorts] objectAtIndex:0]; 
CMClockRef originalClock = [port clock]; 
CMTime syncedPTS = CMSampleBufferGetPresentationTime(sampleBuffer); 
CMTime originalPTS = CMSyncConvertTime(syncedPTS, [session masterClock], originalClock);