1

AVFoundationとCMTimeを使用するアプリケーションを作成しています。CMTimeを使用して作成したインスタンスの値をログに記録しましたCMTimeMake()。この値は、最も近い整数に丸められているようです。CMTime丸めることなく、正確な値を持つインスタンスが必要です。

私は参考文献で丸め定数を見てきましたCMTime

enum {
   kCMTimeRoundingMethod_RoundHalfAwayFromZero = 1,
   kCMTimeRoundingMethod_RoundTowardZero = 2,
   kCMTimeRoundingMethod_RoundAwayFromZero = 3,
   kCMTimeRoundingMethod_QuickTime = 4,
   kCMTimeRoundingMethod_RoundTowardPositiveInfinity = 5,
   kCMTimeRoundingMethod_RoundTowardNegativeInfinity = 6,

   kCMTimeRoundingMethod_Default = kCMTimeRoundingMethod_RoundHalfAwayFromZero
};

これらの戦略のどれをCMTimeインスタンスに適用するかを制御する方法の例はありませんか?CMTimeまたは、これが正しくない場合、インスタンスから正確な値を抽出するにはどうすればよいですか?


編集:

私は見つけてテストしましCMTIME_HAS_BEEN_ROUNDED()た。CMTimeインスタンスをこの関数に渡すと、インスタンスが返されますNo(値が丸められていないことを示します)。では、なぜ私は精度を失っているのですか?

4

2 に答える 2

8

ドキュメントCMTimeを読むと、分子と分母を使用して時間を有理数として格納していることがわかります。分子はint64_t分母がですint32_t

分子は通過した「ティック」の数を指定し、分母は1秒あたりの「ティック」の数を指定します。

したがって、0.5秒は次のように保存できます。

  • 100/200:100ティック、毎秒200ティック
  • 500/1000:500ティック、1000ティック/秒
  • 8 / 16、8ティック、16ティック/秒

などなど。あなたがそれをした方法、を使用して

CMTimeMake([[Array objectAtIndex:i]floatValue], 1);

「1秒に1ティックあります」と言っていますが、分子は整数であるため、float値は切り捨てられ、1のみが格納されます。したがって、時間を次のように指定します。1/1、1ティックが経過し、1秒あたり1ティックであるため、実際には正確に1秒を保存しています。

これを修正するには、何をしたいか、タイムスケールを気にするかどうかによって異なります。Appleは600のタイムスケールを推奨していますが、気にしない場合は、次のようにすることができます。

CMTimeMake([[Array objectAtIndex:i]floatValue]*1000, 1000);

これにより、タイムスケールが1000に設定されるため、1秒あたり1000ティック、つまり1ティックあたり1ミリ秒になります。また、秒単位の時間をミリ秒に変換します。4桁目が切り捨てられることに注意してください。したがって、1.2345の場合、1.235ではなく1.234になります。それがあなたにとって重要な場合は、を参照してくださいroundf

于 2011-03-25T08:17:02.950 に答える
0

CMTimeMake([[Array objectAtIndex:i] floatValue] * 1000、1000);

これは、ミリ秒単位で正確な時間を取得するのに役立ちました。乾杯。

于 2015-03-19T09:59:47.437 に答える