2

所有 QTKit 示例都使用秒来确定范围。不幸的是,我有帧数并且需要帧准确。如果我能弄清楚如何从我的电影中得到它,我想我可以乘以帧速率。

4

2 回答 2

1

您应该能够通过查询以下mediaAttributesa来计算给定视频媒体的帧速率QTMedia

  • QTMediaDurationAttribute

  • QTMediaSampleCountAttribute

(它们在此处的 QTKit 文档中进行了描述)

并使用以下公式进行计算:

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 文件格式的经验,我希望它是这样工作的。

祝你好运!

于 2009-12-16T10:46:00.533 回答
0

乘以帧速率并不精确,因为 Quicktime 使用的许多文件容器和编解码器利用可变帧速率来获得更好的压缩。你会在任何类型的电影中注意到这一点,它具有任何时间长度的定格。以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;
    }
}
于 2010-01-22T19:31:12.340 回答