我有一个视频AVCaptureDevice(AVMediaTypeVideo),使用setExposureTargetBias:completionHandler短暂减少曝光,然后再次恢复它.
我需要准确知道captureOutput中的哪个缓冲区:didOutputSampleBuffer:fromConnection:对应于曝光减少的第一帧.
文档说:
该块接收一个时间戳,该时间戳与已应用该设置的第一个缓冲区的时间戳相匹配.时间戳与设备时钟同步,因此必须先转换为主时钟,然后再与通过AVCaptureVideoDataOutput实例传送的缓冲区的时间戳进行比较.
我如何获得“设备时钟”?
我在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 );
“