Определите фактическую частоту кадров потока, используя QTMovie - PullRequest
3 голосов
/ 14 июля 2011

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

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

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

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

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

1 Ответ

3 голосов
/ 29 августа 2011

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

- (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;
}
...