在iPhone应用程序中捕获60fps

我正在开发一个项目,在那里我们将使用iPhone作为捕捉场景的摄像头。 录制时,我们需要logging@ 60fps而不是30fps(原生支持)。 所以我正在做一个应用程序来做到这一点,因为iPhone 4S硬件支持720p @ 60fps(如果你越狱你的手机,你可以做到这一点)。

有人知道如何在iOS上的Objective-C中做到这一点? 今天我看到一个应用程序(slopro),可以在非越狱手机上logging60fps。 任何意见或提示,非常感谢。

经过一番修改之后,这个答案分为两部分:

如何以60fps捕捉帧

iPhone4s / 5.1上的AVCaptureSessionPreset1280x720,帧持续时间设置为:

connection.videoMinFrameDuration = CMTimeMake(1, 60);* connection.videoMaxFrameDuration = CMTimeMake(1, 60); 

给你一个稳定,超级顺利的捕获。

如何将帧捕获到@ 60fps的文件中
捕获帧是非常好的,但大概你想保留它们。
正如Brad在评论中指出的,将这些帧写入文件是另一回事。 可悲的是,无论我尝试了什么样的configuration,通过AVAssetWriter对帧进行编码AVAssetWriter导致捕获速率下降到观察的〜37fps,并且alwaysDiscardsLateVideoFrames无法改变它。 然而,在这种方法中,每一个帧都从AVFoundation复制到你的应用程序,然后再回来,这是非常毫无意义,非常穿公共汽车。 幸运的是, AVFoundation有一个类去掉了这个往返行程: AVCaptureMovieFileOutput

如果你让AVFoundation为你写,那么iPhone4S可以在60fps *的情况下将帧+audio捕获和编码为.mov文件,而不会打破汗水( AVFoundation %的CPU)。

虽然60fps的video拍摄是一个很棒的function,但是我不禁感到有些失望,因为AVCaptureMovieFileOutput排除了许多有趣的事情(例如GL着色器的实时效果,录制开始/停止而没有帧丢失)。

蛋糕/吃吧

* 59如果你还在运行iOS 5.0.1

我没有尝试过,也许这些是相关的:

  • 在iOS 5中使用AVFoundation设置最大帧速率
  • AVCaptureConnection类参考中的 videoMinFrameDurationvideoMaxFrameDuration
  • CMTime参考 (需要设置videoMaxFrameDuration
Interesting Posts