1

我是一个 OS X 编程新手,我必须以不同的时间间隔从互联网上获取一堆 NSImage,并从中构建一个渐进式电影文件。例如,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;
}
4

1 回答 1

0

自从我使用 QTKit 以来已经有一段时间了,但在过去,我编写了一个应用程序,该应用程序的功能与您描述的非常相似(通过网络获取一些不规则的图像并将它们写入 QuickTime 电影)。

  1. 当您调用-[QTMovie addImage:forDuration:withAttributes]时,duration 参数是影片中图像的持续时间。QTKit 将负责复制它以创建足够的电影帧来覆盖持续时间。简而言之,您无需直接担心帧速率,只需担心每一帧的持续时间。

    您可以通过跟踪接收帧的时间和接收最后一帧的时间来计算帧的持续时间。本质上,当下一个图像出现时,您将每个图像添加到电影中,并使用两个图像的接收时间之间的时间差作为持续时间。当然,你必须做一些稍微不同的事情来解释最后一个图像,这取决于记录是如何停止的(明确地由用户,通过超时等)。

  2. 我不确定这个问题的答案,但我认为你可以假设这是一个你不需要担心的实现细节。在您使用可写文件初始化 QTMovie 对象的情况下,您可能确实可以-updateMovieFile定期调用以将当前内存中的更改刷新到磁盘。这需要测试,但与所有性能优化一样,在测试和分析表明存在问题之前,您不应该担心它。

于 2013-02-20T17:55:19.010 回答