- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 AV Foundation 处理来自摄像机(iPhone 4s、iOS 6.1.2)的帧。我正在根据 AV Foundation 编程指南设置 AVCaptureSession、AVCaptureDeviceInput、AVCaptureVideoDataOutput。一切都按预期工作,我能够在 captureOutput:didOutputSampleBuffer:fromConnection:
委托(delegate)中接收帧。
我也有一个像这样设置的预览层:
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 委托(delegate)接收的帧。
但是,这也限制了预览层上的每秒帧数,并且预览视频变得非常无响应。
我从文档中了解到,帧持续时间是在连接上独立设置的,预览层确实具有不同的 AVCaptureConnection。检查 [videoPreviewLayer connection]
上的混合/最大帧持续时间表明它确实设置为默认值(1/30 和 1/24)并且不同于 AVCaptureVideoDataOutput 连接上设置的持续时间。
那么,是否可以仅在帧捕获输出上限制帧持续时间,并在预览视频中仍然看到 1/24-1/30 帧持续时间?怎么办?
谢谢。
最佳答案
虽然您认为有两个 AVCaptureConnection
是正确的,但这并不意味着它们可以独立设置最小和最大帧持续时间。这是因为它们共享相同的物理硬件。
如果连接 #1 以(比如说)五帧/秒的速率激活卷帘快门,帧持续时间为 1/5 秒,不可能连接 #2 可以同时以 1/30 秒的帧持续时间激活快门 30 次/秒。
要获得您想要的效果,需要两个摄像头!
接近您想要的东西的唯一方法是遵循 Kaelin Colclasure 在 3 月 22 日的回答中概述的方法。
但是,您确实可以选择在该方法中稍微复杂一些。例如,您可以使用计数器来决定丢弃哪些帧,而不是让线程休眠。您可以使该计数器响应正在通过的实际帧速率(您可以从传入 captureOutput:didOutputSampleBuffer:fromConnection:
委托(delegate)的元数据中获取该帧速率以及图像数据,或者您可以通过手动为帧计时来计算自己)。您甚至可以通过合成帧而不是丢弃它们来非常合理地模仿更长的曝光时间——就像 App Store 中的许多“慢快门”应用程序所做的那样(撇开细节——例如不同的卷帘快门人工制品——实际上并没有 以 1/5 秒扫描一帧与以 1/25 秒扫描五帧然后粘合在一起之间有很大差异)。
是的,这需要做一些工作,但您正试图让一台摄像机像两台摄像机一样实时运行 — 这绝非易事。
关于ios - AV 基金会 : AVCaptureVideoPreviewLayer and frame duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15527822/
我有这段代码,它发出黄色警告。我不知道如何编码,所以黄色警告消失了。从 Swift-2 -> 3 -> 4 转换后尝试清理我的代码。 if let previewLayer = AVCaptureVi
如何一次在屏幕上显示多个相机预览? 如果我开始一个新的 AVCaptureSession,另一个就会停止。如果我使用与另一个 session 相同的 session 初始化一个新的 AVCapture
我正在开发一个允许用户拍照的应用程序。我已经开始使用AVCam苹果提供了,但我实际上有一个问题只是我无法将相机层放置在我想要的位置,但它会自动放置在 View 的中心 在左侧,您可以看到我实际拥有的内
我在将 AVCaptureVideoPreviewLayer 安装在其父级范围内时遇到问题。 这是上下文代码: capturePreview = AVCaptureVideoPreviewLa
当我尝试扫描条形码时,我仍然将 AVCaptureVideoPreviewLayer 添加到我的整个 View 中,如果我将条形码放在 View 中心,它会扫描。请帮我解决问题 最佳答案 AVCapt
我试图首先让我的应用程序显示广角相机的相机预览。但我所做的只是没有显示出来。 (该应用程序具有视频和音频权限,正在 iPhone 7 Plus 上进行测试) 这是我的 session 配置代码: fu
我正在使用一个库,使用相机和视频在我的 swift 应用程序上创建自定义相机 https://github.com/yonat/CameraBackground 但是我遇到了延迟,当闪光灯设置关闭时,
是否可以像裁剪图像一样裁剪视频预览层? image .clipShape(Circle()) .overlay(Circle().stroke(Color.gr
我在 AVCaptureVideoPreviewLayer 方面遇到问题。我是这样创建的: self.previewLayer = [AVCaptureVideoPreviewLayer layerW
我正在尝试从 ios 设备的摄像头获取提要以显示在屏幕上,但我不想使用 ImagePickerController,因为我想更好地控制屏幕上 View 的外观,并且我想要更多地控制相机的光圈和采样率。
当我将我的设备从横向向左旋转到横向或从横向向右旋转时,AVCaptureVideoPreviewLayer 会上下颠倒。当我将设备从纵向模式旋转到横向模式时,它工作得很好。这是我的代码 { ov
我正在设置带有预览层的自定义相机。一切正常。我设置了方向和所有内容。请问如何设置自动对焦?第二,如何启动摄像头录制视频?(因为它只是显示前置摄像头显示的内容,你看到你了)...但是我想开始录制。 我更
我正在尝试在我的应用程序中显示自定义摄像头 View 的视频预览,但目前预览非常偏离中心 - 使用前置摄像头时尤其明显。 我是这样定位的: if let previewLayer = AVCaptur
我使用 AVCaptureVideoPreviewLayer 来显示预览视频层、来自该预览的样本图像并对其进行一些处理。该处理识别图像上的一些点并将它们返回。我想(几乎)实时地在预览层上显示这些点。
我有一个 iPhone 相机应用程序,我在其中使用了 AVCaptureVideoPreviewLayer。当有人拍摄照片/静止图像时,这会显示在新的 ViewController 中。一旦这个 Vi
我有一个 AVCaptureVideoPreviewLayer,我想将它填充到我的 UIView 的边界。不过,它似乎无法正常工作。它只显示在大约 3/4 的屏幕上。 CGRect bounds=se
我有一个应用程序可以添加一些实时动画和图像以在 AV Foundation 相机中预览 View 。我可以做“硬件屏幕截图”(按住侧边按钮和提高音量按钮),没问题。但是,我需要一个制作屏幕截图的按钮。
我正在使用 AVCaptureVideoPreviewLayer 来允许用户从 iPhone 相机拍摄照片。所以我有一个 AVCaptureSession,输入为 AVCaptureDeviceInp
如何获取 AVCaptureVideoPreviewLayer 中的图像大小: self.cameraPreviewLayer.frame = self.cameraView.frame; // (0
我目前正在我的 Swift 应用程序中处理 QR 扫描 View 。我想将 VideoPreview 置于 View 中间。 View 看起来像这样: View (白色)称为 ScanView,我想让
我是一名优秀的程序员,十分优秀!