2

こんにちは、AVCaptureScreenInput で minFrameDuration を設定できるように、フレーム レートを表す整数を CMTime に変換しようとしています。

今まで私は

int numberOfFrames = [self convertFrameRateStringToInt:[parameters objectForKey:@"frameRate"]];
Float64 frameDuration = 1.0/numberOfFrames;
NSLog(@"numberOfFrames %i - frameDuration %f",numberOfFrames, frameDuration);
NSLog(@"timeshow %f",CMTimeGetSeconds(CMTimeMakeWithSeconds(frameDuration, 1)));
return CMTimeMakeWithSeconds(frameDuration,1);

numberOfFrames が 15 フレーム/秒に設定されている場合、frameDuration は 0.066667 であるため、CMTimeMakeWithSeconds のパラメーターは 0.066667 と 1 です。これは、CMTimeGetSeconds が 0.066667/1 = 0.066667 を返す必要があることを意味しますが、代わりに 0 を返します。

誰かが私が間違っていることを理解し、その理由を説明できますか? ありがとう。

Edit1:次のように機能を変更するようにしました:

int numberOfFrames = [self convertFrameRateStringToInt:string];
NSLog(@"timeshow %f",CMTimeGetSeconds(CMTimeMake(1, (int32_t)numberOfFrames)));
return CMTimeMake(1, (int32_t)numberOfFrames);

最後の方法がうまくいかなかった理由がまだわかりません

4

1 に答える 1

0

あなたはあなたのCMTimeように構築する必要があります:

CMTimeMake(1, numberOfFrames);

CMTime は、分子 (int64_t 値) と分母 (int32_t タイムスケール) を持つ有理数として表されます。概念的には、タイムスケールは、分子の各単位が占める秒の端数を指定します。したがって、タイムスケールが 4 の場合、各単位は 1/4 秒を表します。タイムスケールが 10 の場合、各単位は 10 分の 1 秒を表します。

あなたの通話は にCMTimeMakeWithSeconds追加kCMTimeFlags_HasBeenRoundedされCMTimeます。そのため、最も近い完全な秒に丸められます。

于 2013-06-27T17:37:04.587 に答える