是否可以从两个帧编号创建QTTimeRange?

时间:2009-11-03 03:42:20

标签: quicktime qtkit

所有QTKit示例都使用秒来制作范围。遗憾的是,我有帧编号,需要帧精确。如果我能弄清楚如何从我的电影中得到它,我想我可以乘以帧速率。

2 个答案:

答案 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:atTimeframeEndTime: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;
    }
}