6

私は AVCaptureSession の中にいて、キャプチャされているフレームの番号を知る必要があります。

キャプチャが開始したら、フレーム番号カウンターをゼロにリセットします。したがって、最初のフレームのタイムスタンプはゼロになります。後続のフレームには、次のようなキャプチャ タイムスタンプがあります。

0
0.033
0.066
0.099
etc

ただし、これらは正確な数値ではありません。フレームがドロップする可能性があり、わずかな違いが発生する可能性があるためです。フレームがキャプチャされた正確な時間を知る必要があります。

フレームが取得されるたびに呼び出されるこのメソッドがあります...

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 

このメソッド内で、フレームの CMTime を取得し、次を使用してコンソールに出力できます。

CMTime timestamp = CMSampleBufferGetPresentationTimeStamp( sampleBuffer );
NSLog(@"%lld", timestamp.value);

しかし、これは私に次のようなワイルドナンバーを与えます

156317265588132
156317307247388
156317348909678
156317390573453
156317432230603

ある数値と次の数値の差は約 41,659,256 であり、フレームが取得されたときの秒数を小数点以下の桁数で表していないようです。

この数値をタイムスケールで割ると、

NSLog(@"%lld", timestamp.value/timestamp.timescale);

数値は 25 フレームで同じで、1 秒に達したときにのみ変化します。

フレームがグラブされたときに正確なタイムスタンプを秒単位で取得するにはどうすればよいですか? ありがとう。

4

1 に答える 1

8

この数値をタイムスケールで割ると、数値は 25 フレームで同じになり、1 秒に達したときにのみ変化します。

整数除算は切り捨てられるためです。どうですか

NSLog(@"%f", (float)timestamp.value / timestamp.timescale);
于 2012-11-10T13:47:22.137 に答える