在iPhone应用程序中捕获每秒60帧

在iPhone应用程序中捕获每秒60帧,iphone,ios,recording,avcapturesession,Iphone,Ios,Recording,Avcapturesession,我正在做一个项目,我们将使用iPhone作为摄像机来捕捉场景。录制时,我们需要录制@60fps,而不是30fps(本机支持)。因此,我正在开发一个应用程序来实现这一点,因为iPhone 4S硬件支持这一点720p@60fps(如果你越狱你的手机,你可以做到这一点) 有人知道如何在iOS上用Objective-C实现这一点吗?今天我看到了一个应用程序(Sloro),可以在非越狱手机上记录60帧/秒。非常感谢您提供的任何建议或提示。我以前从未尝试过此方法,可能与以下方面有关: videoMinF

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


有人知道如何在iOS上用Objective-C实现这一点吗?今天我看到了一个应用程序(Sloro),可以在非越狱手机上记录60帧/秒。非常感谢您提供的任何建议或提示。

我以前从未尝试过此方法,可能与以下方面有关:

  • videoMinFrameDuration
    videoMaxFrameDuration
    in
  • (需要设置
    videoMaxFrameDuration

经过一些修补,这个答案分为两部分:

如何以60fps的速度捕获帧

iPhone 4S/5.1上的AVCaptureSessionPreset1280x720,帧持续时间设置为:

connection.videoMinFrameDuration = CMTimeMake(1, 60);*
connection.videoMaxFrameDuration = CMTimeMake(1, 60);
为您提供稳定、超平滑的拍摄效果

如何以60fps的速度将帧捕获到文件中
捕获帧非常好,但您可能希望保留它们。
正如Brad在评论中指出的,将这些帧写入文件是另一回事。 可悲的是,无论我尝试了什么配置,通过
AVAssetWriter
对帧进行编码都会导致捕获速率下降到观察到的~37 fps,并且无论怎样摆弄
始终都无法改变它。然而,在这种方法中,每一帧都是从AVFoundation复制到你的应用程序中,然后再复制回来,这对总线来说是毫无意义的,也是非常耗时的。幸运的是,
AVFoundation
有一个类删除了这个往返:
AVCaptureMovieFileOutput

如果让
AVFoundation
为您编写,那么iPhone4S可以以60fps*的速度捕获帧+音频并将其编码为.mov文件,而无需花费大量精力(~25%的CPU)

虽然60fps视频捕获是一项很棒的功能,但我还是忍不住感到有点失望,因为
AVCaptureMovieFileOutput
排除了很多有趣的事情(例如,使用GL着色器的实时效果,在不丢失帧的情况下录制开始/停止)

吃蛋糕/吃它


*59如果您仍在运行iOS 5.0.1

不知道为什么投票关闭此问题?这似乎是一个很好的,不重复的问题后,良好的研究提出。当然,OP不知道从哪里开始,但至少他说他正在寻找的是可能的,并且已经被非越狱手机上的其他应用程序完成了。是的,澄清一下,我不想越狱。iPhone上有一些慢动作应用程序(TimeFreeze、slopro)。所以我知道这是可能的。好吧,我来看看。有人知道这些属性支持的最大值是多少吗?我只是注意到我在回答中给出了一些不正确的链接(适用于Mac OS)。抱歉,我删除了错误的。大家好,有人有幸做到这一点吗?我用这些API设置帧速率,不知道它有多高,但这正是您所期待的。我可以确认,强制帧速率为60 FPS(在上面的代码中,您确实可以使用60而不是59)在iPhone 4S上工作,尽管不是在新的(视网膜)iPad上,但它只适用于720p预设,不适用于640x480或1080p。我能够以59.87 FPS的速度拍摄和录制一部电影(开始时减少了几帧),尽管我不得不将音频和视频采样降低到640x480,以使AVAssetWriter能够跟上我的实现。在iOS 5.0.1上,59fps似乎是唯一适合我的速率。在更多的测试之后,我会更新我的答案。我的测试是在5.1上进行的,并且
CMTimeMake(1,60)
是在那里发布的。考虑到这并没有确切的文档记录,点更新之间很可能存在差异。我想我已经找到了答案,但我觉得自己被骗了。今天我在iPhone 4S上做了一些测试,输入为:AVCaptureDeviceInput,输出为:AVCaptureMovieFileOutput。即使在设置时:connection.videoMinFrameDuration=CMTimeMake(1,60);connection.videoMaxFrameDuration=CMTimeMake(1,60);它似乎不希望录制超过30fps(使用AVCaptureSessionPreset1280x720)。