2016-08-26 3 views
0

정확한 타임 스탬프로 비디오 녹화를 시작하려고합니다.정확한 타임 스탬프로 녹화 시작

발견 된 방법을 사용하여 각 프레임의 타임 스탬프를 얻을 수있었습니다 : 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) 사이에있을 수있는 작은 간격.

가 어떻게 사용되는 첫 번째 프레임은 당신이 시간이 중요한 기능을 필요로 할 때 내가

답변

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에서 얼마나 오랫동안 말하지 않습니다.

+0

답변 해 주셔서 감사합니다. 그러나, 나의 경우에는 "당신의 일들"은 시간이 걸리는 것과 같습니다.이 방법은 내 녹화 된 비디오의 첫 번째 프레임을 정확하게 원하는 타임 스탬프로 만들지 않을 것입니다. – Nilsymbol

+0

그런 다음 'sleepUntilDate' 호출 전에 수행하십시오 –

+0

버퍼 스트림은 avcapturesession에서 비롯되며 불행히도 이런 식으로 "일시 중지 가능"하지 않습니다. – Nilsymbol

관련 문제