Использование QTKit для добавления NSImages в фильм со случайной частотой кадров

Я новичок в программировании OS X, мне нужно взять кучу NSImages, поступающих из Интернета с разным интервалом, и создать из него файл прогрессивного фильма. Например, скорость поступления NSImage может варьироваться от миллисекунд до 3 секунд.

  1. Мне интересно, правильный ли это способ сделать это с помощью QTKit и как рассчитать частоту кадров, поскольку кадры поступают почти в случайное время.

  2. Меня также интересует использование памяти, будет ли он пытаться сохранить весь фильм в памяти, прежде чем записывать его в конце?

Вот код, который я собрал из Интернета:

-(void)startRecording  
{
    NSDictionary *myDict = nil;
    myDict = [NSDictionary dictionaryWithObjectsAndKeys:@"mp4v",
              QTAddImageCodecType,
              [NSNumber numberWithLong:codecHighQuality],
              QTAddImageCodecQuality,
              nil];

    long long timeValue = 1;
    long timeScale      = 3;
    QTTime duration     = QTMakeTime(timeValue, timeScale);
    QTMovie *mMovie =[[QTMovie alloc] initToWritableFile:@"tmpfps.tmp" error:NULL];

    self.mMovie=mMovie;
    self.duration=duration;
    self.myDict=myDict;
}

-(void) addFrame:(NSImage*)imageFrame
{
    [mMovie addImage:imageFrame
         forDuration:self.duration
      withAttributes:self.myDict];
}

-(void) stopRecording
{
    myDict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
                                         forKey:QTMovieFlatten];
    [self.mMovie writeToFile:@"my.mov" withAttributes:myDict];
    self.mMovie=nil;
}

person N S    schedule 20.02.2013    source источник


Ответы (1)


Прошло некоторое время с тех пор, как я работал с QTKit, но в прошлом я написал приложение, которое делало что-то очень похожее на то, что вы описываете (снимало изображения, поступающие по сети несколько нерегулярно, и записывало их в фильм QuickTime).

  1. При вызове -[QTMovie addImage:forDuration:withAttributes] параметр продолжительности — это продолжительность изображения в фильме. QTKit позаботится о его дублировании, чтобы создать достаточное количество кадров фильма, чтобы покрыть продолжительность. Короче говоря, вам не нужно беспокоиться непосредственно о частоте кадров, а только о продолжительности каждого кадра.

    Вы можете определить продолжительность кадра, отслеживая, когда он был получен и когда был получен последний кадр. По сути, вы добавляете каждое изображение в фильм, когда появляется следующее изображение, и используете разницу во времени между временем получения двух изображений в качестве продолжительности. Конечно, вы должны сделать что-то немного другое для учета последнего изображения, в зависимости от того, как запись остановлена ​​(явно пользователем, через тайм-аут и т. д.).

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

person Andrew Madsen    schedule 20.02.2013
comment
Большое спасибо. Я пытаюсь понять, как я могу делать временные метки и дельты времени с помощью QTTime API, но я не вижу какой-либо функции QTTime, которую я мог бы использовать для записи текущего времени, а затем взять разницу, чтобы я мог использовать ее с addImage: продолжительность: метод withAttributes. - person N S; 27.02.2013