以准确的时间戳开始录制

时间:2016-08-26 17:43:51

标签: ios objective-c avfoundation avcapturesession

我正在尝试以准确的时间戳开始录制视频。

我设法通过使用找到的方法获取每个帧的时间戳:herehere

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ 
    CMTime time = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
    ...
    // check if time > timestampToStart, use these frames

}

通过这样做,我只能使用我指定的时间戳之后的帧。

问题是所使用的第一帧在timstampToStart中不会完全,而是timstampToStart加上一个小间隔,可以在0-1 / fps之间(通常为fps = 24)。 / p>

如何确保使用的第一帧与我想要的时间戳完全(或非常接近)

1 个答案:

答案 0 :(得分:0)

如果您需要时间要求严格的功能,请使用NSThread

- (IBAction)startCapture:(id) sender
 {
    NSDate * startTime = [now dateByAddingTimeInterval: 10.12345];

    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(capture:) object:startTime];
    [thread start];
}

- (void)capture:(id) context
{
    NSDate * startTime = (NSDate *) context;
    [NSThread sleepUntilDate:startTime];

    // Do your things...
}

线程将在设置时间的几纳秒内唤醒,除非CPU非常繁忙。但是,创建一个线程需要一些时间,所以不要如此密切地设置开始时间。 OS X上的线程创建时间约为~90 microseconds。Apple没有说iOS上有多长时间。