2

您好我正在尝试将表示帧速率的整数转换为 CMTime,以便能够在 AVCaptureScreenInput 中设置 minFrameDuration。

直到现在我有

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,则每个单位表示四分之一秒;如果时间刻度为 10,则每个单位表示十分之一秒,依此类推。

您的通话CMTimeMakeWithSeconds添加kCMTimeFlags_HasBeenRoundedCMTime. 这就是为什么它会四舍五入到最接近的整秒。

于 2013-06-27T17:37:04.587 回答