2016-08-26 8 views
0

正確なタイムスタンプでビデオの録画を開始しようとしています。正確なタイムスタンプでの録画の開始

見つかった方法を使用して各フレームのタイムスタンプを取得できました:hereおよびhere

- (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