ios - Preview doesn't show up (AVCaptureVideoPreviewLayer)
问题描述
I'm trying to first just get my app to show the camera preview of the wide angle camera. But what I do it just doesn't show up. (the app has video and audio permission and is being tested on an iPhone 7 Plus)
Here's my session configuration code:
func configureSession() throws {
session.beginConfiguration()
// configure inputs
let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
let audioDevice = AVCaptureDevice.default(.builtInMicrophone, for: .audio, position: .unspecified)
guard let videoInput = try? AVCaptureDeviceInput(device: videoDevice!), let audioInput = try? AVCaptureDeviceInput(device: audioDevice!), session.canAddInput(videoInput), session.canAddInput(audioInput) else {
throw CameraError.configurationFailed
}
// configure outputs
let output = AVCaptureMovieFileOutput()
let previewOutput = AVCaptureVideoDataOutput()
previewOutput.alwaysDiscardsLateVideoFrames = true
previewOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String : NSNumber(value: kCVPixelFormatType_32BGRA)]
guard session.canAddOutput(output) && session.canAddOutput(previewOutput) else {
throw CameraError.configurationFailed
}
session.sessionPreset = .high
session.addOutput(output)
session.addOutput(previewOutput)
session.commitConfiguration()
}
and this is the code for the previewLayer
:
// adds given view as previewView to the session
func configureAsPreview(_ view: UIView) {
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
view.layer.addSublayer(previewLayer)
previewLayer.frame = view.layer.frame
}
and it is being called in viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if cameraManager.hasPermissionForVideo {
try! cameraManager.configureSession()
cameraManager.configureAsPreview(self.previewView)
cameraManager.startSession()
} else {
performSegue(withIdentifier: "presentPermissions", sender: nil)
}
}
What am I doing wrong? I really can't figure it out and it's probably just something stupidly small.
Thanks.
解决方案
在需要时尝试更新图层框架,并使用bounds
而不是frame
. 图层不支持自动调整大小,您需要手动管理它。
private var __previewLayer = AVCaptureVideoPreviewLayer? = nil
func configureAsPreview(_ view: UIView) {
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
self.view.layer.addSublayer(previewLayer)
previewLayer.frame = self.view.bounds
self.__previewLayer = previewLayer
}
override viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.__previewLayer?.frame = self.view.bounds
}
推荐阅读
- .net - 使用 .NET 以编程方式运行流分析转换查询
- c# - 通用 C# 函数问题创建
- google-bigquery - 从 Google 公共数据集中提取特定年份的数据 - chicago_taxi_trips
- android - 如何在 Android 中使用摄像头读取和计算人体血压?
- javascript - 下载zip并保存解压
- python - 如何避免使用 Selenium 在网络抓取中出现文本图像验证码
- assembly - 汇编语言堆栈帧访问冲突读取位置问题
- angular - aria-label 属性不起作用 ngb-tabset
- r - 配置 Docker 容器和 R 以允许从容器内部进行 API 查询?
- amazon-web-services - 如何在 Cloudformation 中按用户名隔离事件