ios – AVCaptureDevice:比较samplebuffer时间戳

我有一个视频AVCaptureDevice(AVMediaTypeVideo),使用setExposureTargetBias:completionHandler短暂减少曝光,然后再次恢复它.

我需要准确知道captureOutput中的哪个缓冲区:didOutputSampleBuffer:fromConnection:对应于曝光减少的第一帧.

文档说:

该块接收一个时间戳,该时间戳与已应用该设置的第一个缓冲区的时间戳相匹配.时间戳与设备时钟同步,因此必须先转换为主时钟,然后再与通过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;  

我是在正确的轨道上吗?

最佳答案 在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 );

点赞