当前位置: 首页 > 知识库问答 >
问题:

AV基础:AVCaptureVideoPreviewLayer和帧持续时间

梁存
2023-03-14

我正在使用AV Foundation来处理视频摄像头(iPhone4S和iOS 6.1.2)中的帧。我正在根据AV Foundation编程指南设置AVCaptureSession、AVCaptureDeviceInput、AVCaptureVideoDataOutput。所有工作都按预期进行,并且我能够接收captureoutput:DidOutputSampleBuffer:FromConnection:委托中的帧。

我还有一个预览图层设置是这样的:

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 earlier
AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo];
[conn setVideoMinFrameDuration:CMTimeMake(1, 10)];
[conn setVideoMaxFrameDuration:CMTimeMake(1, 2)];

这可以很好地工作,并限制captureOutput委托接收的帧。

然而,这也限制了预览层上的每秒帧数,预览视频变得非常无响应。

我从文档中了解到,帧持续时间是在连接上独立设置的,并且预览层确实有一个不同的AVCaptureConnection。检查[videoPreviewLayer connection]上的Mix/Max帧持续时间显示,它确实设置为默认值(1/30和1/24),并且与AVCaptureVideoDataOutput连接上设置的持续时间不同。

那么,有没有可能只在帧捕获输出上限制帧时长,而在预览视频上仍然看到1/24-1/30帧时长呢?怎么做?

多谢了。

共有1个答案

齐元章
2023-03-14

虽然有两个avCaptureConnection是正确的,但这并不意味着它们可以独立设置最小和最大帧持续时间。这是因为它们共享相同的物理硬件。

如果连接#1正以(例如)5帧/秒的速率以1/5秒的帧持续时间激活滚动快门,则连接#2不可能以1/30秒的帧持续时间同时激活快门30次/秒。

要得到你想要的效果需要两台相机!

但是,在这种方法中,您确实可以选择稍微复杂一些。例如,您可以使用计数器来决定要删除哪些帧,而不是使线程Hibernate。您可以使该计数器响应通过的实际帧速率(您可以从与图像数据一起进入CaptureOutput:DidOutputSampleBuffer:FromConnection:委托的元数据中获得该帧速率,或者您可以通过手动定时帧来计算该帧速率)。你甚至可以通过合成帧而不是丢弃帧来模仿更长的曝光时间--就像App Store中的一些“慢快门”应用所做的那样(抛开细节不谈--比如不同的滚动快门伪影--以1/5秒扫描的一帧和以1/25秒扫描的五帧然后粘在一起并没有太大区别)。

是的,这是一个小工作,但你试图使一个视频摄像机的行为像两个,在实时--这绝不会是一件容易的事。

 类似资料:
  • apply 方法 当类或对象有一个主要用途的时候,apply方法为你提供了一个很好的语法糖。 scala> class Foo {} defined class Foo scala> object FooMaker { | def apply() = new Foo | } defined module FooMaker scala> val newFoo = FooM

  • 问题内容: 我正在玩gobpf,在计算跟踪的用户空间函数的持续时间时遇到问题。我使用bpf_ktime_get_ns()读取时间,然后尝试计算增量,但是得到了很多数字,尽管跟踪函数仅睡了1秒钟。 这是经过测试的C程序,其功能称为“ ameba”。 去代码 程序输出示例: PID命令持续时间RAW 15515 ameba 1193179h21m9.457496929s 429544566945749

  • 问题内容: 如何获取格式为2个字符串的持续时间? 我正在尝试使用Calendar类并检查。我与此有关的问题是它不一致。知道我在做什么错吗?每次我运行该程序时,如果没有,输出40-70行到控制台。 问题答案: 那是一个已记录的错误。 尝试在设置日历之前清除日历:

  • 许多记者将显示测试持续时间,以及标记缓慢的测试,如“spec”记者所示: 要调整被认为“慢”的东西,您可以使用以下slow()方法: describe('something slow', function() { this.slow(10000); it('should take long enough for me to go make a sandwich', function() { /

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/test_and_ci/continous_integration.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e PX4 Continuous Integration PX4 builds and

  • FPS定义为每秒的帧数。但当我尝试使用总帧数/持续时间计算FPS时,得到的数字与ffmpeg中显示的FPS略有不同: 为了这个视频http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4 使用ffmpeg,我们可以获得其FPS、持续时间和总帧数: ffprobe-选择\u streams v-