Определите фактическую частоту кадров потока с помощью QTMovie

Я использую QTMovie с QTMovieOpenForPlaybackAttribute:YES и использую QTMovieView для его отображения. Мне нужно рассчитать частоту кадров, которую он достигает.

Один из способов, которым я могу это сделать, - это иметь обратный вызов, который вызывается каждый раз, когда кадр собирается отобразиться или готов к отображению - кто-нибудь знаком с таким обратным вызовом?

Другой способ - иметь таймер, который использует -currentFrameImage и сравнивает его с последним протестированным изображением кадра - однако, во-первых, я не знаю, как вы будете сравнивать два NSImages, а во-вторых, я бы предположил, что это будет проблематично, если бы два последовательные кадры были одинаковыми, это фактически предполагало, что кадр был отброшен, когда он не был

Последний способ, о котором я могу думать, - это снова использовать таймер, на этот раз для вызова -currentTime. Я пробовал это, однако по какой-то причине timeScale установлен на 1000000000. I прочитайте, что шкала времени должна быть 100 * fps, так почему currentTime возвращает, что FPS составляет 10000000? Это кажется совершенно неверным. В возвращаемом QTTime нет установленных флагов.

Я повсюду искал информацию об этом - любые поиски, связанные с частотой кадров, приводят меня только к тому, как установить частоту кадров при захвате, а это не то, что я ищу.


person BenC    schedule 14.07.2011    source источник
comment
Шкала времени не всегда 100 * fps; он может быть любым, достаточно большим для обеспечения точности, необходимой для представления частоты кадров.   -  person koan    schedule 30.05.2012


Ответы (1)


Попробуй это:

- (double)frameRate
{
    double result = 0;

    for (QTTrack* track in [_movie tracks])
    {
        QTMedia* trackMedia = [track media];

        if ([trackMedia hasCharacteristic:QTMediaCharacteristicHasVideoFrameRate])
        {
            QTTime mediaDuration = [(NSValue*)[trackMedia attributeForKey:QTMediaDurationAttribute] QTTimeValue];
            long long mediaDurationScaleValue = mediaDuration.timeScale;
            long mediaDurationTimeValue = mediaDuration.timeValue;
            long mediaSampleCount = [(NSNumber*)[trackMedia attributeForKey:QTMediaSampleCountAttribute] longValue];
            result = (double)mediaSampleCount * ((double)mediaDurationScaleValue / (double)mediaDurationTimeValue);
            break;
        }
    }
    return result;
}
person Davyd Geyl    schedule 29.08.2011