所有QTKit示例都使用秒来制作范围。遗憾的是,我有帧编号,需要帧精确。如果我能弄清楚如何从我的电影中得到它,我想我可以乘以帧速率。
答案 0 :(得分:1)
您应该能够通过查询mediaAttributes
的以下QTMedia
来计算给定视频媒体的帧速率:
QTMediaDurationAttribute
QTMediaSampleCountAttribute
(它们在QTKit docs here中描述)
并使用以下公式进行计算:
QTTime duration = ... // value get from mediaAttribute
NSNumber sample_count = ... // value get from mediaAttribute
double fps = (sample_count.longValue * duration.timeScale) / duration.timeValue;
声明:
请注意,如果有效,我还没有尝试过,但根据我对QuickTime C API和QuickTime文件格式的体验,我希望它能够正常工作。
祝你好运!
答案 1 :(得分:0)
乘以帧速率并不准确,因为Quicktime使用的许多文件容器和编解码器都使用variable frame rates来获得更好的压缩效果。你会注意到任何类型的电影都会在任何时间内冻结帧。请参阅macbreak的The Road to 1080p, part1作为示例。
您可以使用OSX 10.6中引入的QTMovie方法frameStartTime:atTime和frameEndTime:atTime来确定帧精确范围。这些将分别为您提供帧的开始和结束,而无需进行帧解码。
例如,计算电影中的所有帧:
// Initialize QTMovie object called 'movie', disable looping, etc
[movie gotoEnd];
QTTime endTime = [movie currentTime];
[movie gotoBeginning];
QTTime curTime = [movie currentTime];
unsigned long numFrames = 0;
while (true)
{
% get the end time of the current frame
[movie frameEndTime:&curTime];
numFrames++;
% If we get to the last frame, stop counting
if (QTTimeCompare(curTime, endTime) == NSOrderedSame)
{
break;
}
}