iphone - 使用不四舍五入的 CMTime?

标签 iphone ios avfoundation avmutablecomposition core-media

我正在编写一个使用 AVFoundation 和 CMTime 的应用程序。我已经记录了使用 CMTimeMake() 创建的 CMTime 实例的值。该值似乎四舍五入为最接近的整数。我需要一个具有精确值且不四舍五入的 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(表示该值尚未四舍五入)。那么为什么我会失去精度呢?

最佳答案

如果您阅读 documentation for CMTime您会看到它使用分子和分母将时间存储为有理数。分子是int64_t,分母是int32_t

分子指定了多少个“滴答声”,分母指定了每秒多少个“滴答声”。

所以 0.5 秒可以存储为:

  • 100/200:100 个滴答声,每秒 200 个滴答声
  • 500/1000:500 次计时,每秒 1000 次计时
  • 8/16,8 个滴答,每秒 16 个滴答

等等。你这样做的方式,使用

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

表示“每秒有一个滴答声”,由于分子是整数,浮点值被截断,因此只存储 1。因此,您将时间指定为:1/1,一个滴答已经过去,每秒一个滴答,所以您实际上存储正好 1 秒。

要解决此问题,这取决于您想做什么以及您是否关心时间尺度。 Apple recommends a timescale of 600 , 但如果你不在乎,你可以这样做:

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

将时间刻度设置为 1000,即每秒 1000 次滴答,即每滴答 1 毫秒。它还将以秒为单位的时间转换为毫秒。请注意,它会截断第 4 位数字,因此如果您有 1.2345,您只会得到 1.234 而不是 1.235。如果这对您很重要,请参阅 roundf

关于iphone - 使用不四舍五入的 CMTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5418077/

相关文章:

iphone - 还有其他人在已发布的 IOS 5 上安装 iPhone Enterprise 应用程序时遇到问题吗?

iphone - 向 Objective-C 和 C 代码添加过程标签

ios - View 位于标签栏下 - iOS7 Autolayout

ios - 了解核心视频 CVPixelBufferPool 和 CVOpenGLESTextureCache 语义

ios - 在 iOS 设备上的 WebRTC 上使用当前的 AVCaptureSession

objective-c - 什么是 OSStatus -12500?

ios - GPUImageMovieWriter - 录制视频两端偶尔出现黑帧

iPhone - 如何检测 NSUserDefaults standardUserDefaults 中是否存在 key

iphone - 在 Swift 后台下载

javascript - React Native 中的 setTimeout