我还有一个像这样的预览图层集:
AVCaptureVIDeoPrevIEwLayer *vIDeoPrevIEwLayer = [[AVCaptureVIDeoPrevIEwLayer alloc] initWithSession:_captureSession];[vIDeoPrevIEwLayer setFrame:self.vIEw.bounds];vIDeoPrevIEwLayer.vIDeoGravity = AVLayerVIDeoGravityResizeAspectFill;[self.vIEw.layer insertSublayer:vIDeoPrevIEwLayer atIndex:0];
事实是,在我的帧处理中我不需要每秒30帧,而且无论如何我都无法如此快速地处理它们.所以我使用此代码来限制帧持续时间:
// vIDeoOutput is AVCaptureVIDeoDataOutput set earlIErAVCaptureConnection *conn = [vIDeoOutput connectionWithMediaType:AVMediaTypeVIDeo];[conn setVIDeoMinFrameDuration:CMTimeMake(1,10)];[conn setVIDeoMaxFrameDuration:CMTimeMake(1,2)];
这工作正常,并限制captureOutput委托收到的帧.
但是,这也限制了预览图层上的每秒帧数,预览视频变得非常无响应.
我从文档中了解到,帧持续时间是在连接上独立设置的,而预览层确实有不同的AVCaptureConnection.检查[vIDeoPrevIEwLayer连接]上的混合/最大帧持续时间表明它确实设置为默认值(1/30和1/24),并且与AVCaptureVIDeoDataOutput连接上设置的持续时间不同.
那么,是否可以仅在帧捕获输出上限制帧持续时间,并且仍然可以在预览视频上看到1 / 24-1 / 30帧持续时间?怎么样?
谢谢.
解决方法 虽然你有两个AVCaptureConnections是正确的,但这并不意味着他们可以独立设置最小和最大帧持续时间.这是因为它们共享相同的物理硬件.如果连接#1以(例如)五帧/秒的速率激活卷帘快门并且帧持续时间为1/5秒,则连接#2无法用帧同时激活快门30次/秒持续时间为1/30秒.
要获得你想要的效果需要两个相机!
接近你想要的唯一方法是遵循Kaelin Colclasure在3月22日回答中概述的方法.
但是,您可以选择在该方法中更复杂一些.例如,您可以使用计数器来决定丢弃哪些帧,而不是让线程休眠.您可以使该计数器响应即将到来的实际帧速率(您可以从进入captureOutput的元数据中获取:dIDOutputSampleBuffer:fromConnection:delegate以及图像数据,或者您可以通过手动计时自行计算框架).您甚至可以通过合成帧而不是丢弃它来非常合理地模仿更长时间的曝光 – 就像App Store中的一些“慢速快门”应用程序一样(抛开不同的细节 – 例如不同的卷帘快门假象 – 实际上并不是这样)在1/5秒扫描的一帧和在1/25秒扫描的五帧之间然后胶合在一起的差异很大.
是的,这是一项工作,但你正在尝试让一个摄像机像两个一样,实时 – 这永远不会那么容易.
总结以上是内存溢出为你收集整理的ios – AV Foundation:AVCaptureVideoPreviewLayer和帧持续时间全部内容,希望文章能够帮你解决ios – AV Foundation:AVCaptureVideoPreviewLayer和帧持续时间所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)