我是一个操作系统X编程新手,我必须以不同的间隔从互联网上获取一堆NSImage,并从中构建一个渐进的电影文件。例如,NSImage的到达速度可能从毫秒到3秒不等。
-
我想知道这是否是使用QTKit的正确方法,以及如何计算帧速率,因为帧几乎是随机进入的。
-
我还想知道内存的使用情况,它会在写最后之前把整部电影都记在内存中吗?
这是我从网上拼凑的代码:
-(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;
}
我已经有一段时间没有使用QTKit了,但过去我写了一个应用程序,它的功能与你描述的非常相似(拍摄网络上不规则的图像,并将其写入QuickTime电影)。
-
调用
-[QTMovie addImage:forDuration:withAttributes]
时,持续时间参数是影片中图像的持续时间。QTKit将负责复制它,以创建足够的电影帧来覆盖持续时间。简而言之,你不需要直接担心帧速率,只需要担心每帧的持续时间。您可以通过跟踪接收帧的时间和接收最后一帧的时间来计算帧的持续时间。本质上,当下一个图像出现时,您将每个图像添加到电影中,并使用两个图像的接收时间之间的时间差作为持续时间。当然,你必须做一些稍微不同的事情来解释最后一个图像,这取决于记录是如何停止的(明确地由用户,通过超时等)
-
我不太确定这个问题的答案,但我认为您可以假设这是一个不需要担心的实现细节。在使用可写文件初始化QTMovie对象的情况下,可以定期调用
-updateMovieFile
将当前内存中的更改刷新到磁盘。这将需要测试,但与所有性能优化一样,在测试和分析表明存在问题之前,您不应该担心它。