- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在运行 ios 12 swift 4.2。
我已经实现了一个基本的相机捕捉 session ,并且正在从中点击图像。一切都很好,直到我在自动/开/关模式之间切换闪光灯。单击第一张照片然后更改闪光灯模式后,应用程序崩溃并出现错误:
[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] Settings may not be re-used'
以下是相机实现:
var captureSession: AVCaptureSession!
var videoPreviewLayer: AVCaptureVideoPreviewLayer!
var capturePhotoOutput: AVCapturePhotoOutput!
let capturePhotoSettings = AVCapturePhotoSettings()
var previewView: UIView!
override func viewDidLoad() {
startCameraSession()
setupCaptureOutput()
}
@objc // Tap on a button to capture
func takePhotoOnTap() {
guard let capturePhotoOutput = self.capturePhotoOutput else { return }
capturePhotoSettings.isAutoStillImageStabilizationEnabled = true
capturePhotoSettings.isHighResolutionPhotoEnabled = true
capturePhotoSettings.flashMode = .auto
let _ = getSettings(camera: captureDevice!, flashMode: spotmiCameraOptions.flashMode)
capturePhotoOutput.capturePhoto(with: capturePhotoSettings, delegate: self)
}
//This is a delegate method from the button
func toggleFlash(mode: FlashMode) {
switch mode {
case .auto:
capturePhotoSettings.flashMode = .auto
case .enabled:
capturePhotoSettings.flashMode = .on
case .disabled:
capturePhotoSettings.flashMode = .off
}
}
func setupCaptureOutput() {
capturePhotoOutput = AVCapturePhotoOutput()
capturePhotoOutput.isHighResolutionCaptureEnabled = true
captureSession.addOutput(capturePhotoOutput)
}
func startCameraSession() {
let captureDevice = AVCaptureDevice.default(.builtInDualCamera, for: AVMediaType.video, position: .back)
do {
let input = try AVCaptureDeviceInput(device: captureDevice!)
captureSession = AVCaptureSession()
captureSession.addInput(input)
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
videoPreviewLayer.videoGravity = .resizeAspectFill
videoPreviewLayer.frame = self.view.layer.bounds
camcontainer.layer.addSublayer(videoPreviewLayer)
captureSession.startRunning()
} catch {
print(error.localizedDescription)
}
}
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {
guard error == nil, let sampleBuffer = photoSampleBuffer else {
print("error capturing photo due to \(String(describing: error?.localizedDescription))")
return
}
guard let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer) else { return }
let capturedImage = UIImage(data: imageData, scale: 1.0)
if let image = capturedImage {
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
}
func getSettings(camera: AVCaptureDevice, flashMode: FlashMode) -> AVCapturePhotoSettings {
let settings = capturePhotoSettings
if camera.hasFlash {
switch flashMode {
// case .auto: settings.flashMode = .auto
case .enabled: settings.flashMode = .on
case .disabled: settings.flashMode = .off
default: settings.flashMode = .auto
}
}
return settings
}
我真的不明白如何准确地重用 captureSettings
并每次使用不同的闪光模式更改它。我经历了几个问题,但它们主要是关于手电筒的。我在找闪光灯。
非常感谢任何帮助。
最佳答案
AVCapturePhotoSettings
对象是唯一的,不能重复使用,因此每次使用此方法都需要获取新的设置:
func getSettings(camera: AVCaptureDevice, flashMode: CurrentFlashMode) -> AVCapturePhotoSettings {
let settings = AVCapturePhotoSettings()
if camera.hasFlash {
switch flashMode {
case .auto: settings.flashMode = .auto
case .on: settings.flashMode = .on
default: settings.flashMode = .off
}
}
return settings
}
如您所见,不需要lockConfiguration
。
CurrentFlashMode
是 enum
,创建它是为了让事情更清楚:
枚举 CurrentFlashMode { 关闭案例 案例 案例汽车
然后在拍摄照片时简单地使用它:
@IBAction func captureButtonPressed(_ sender: UIButton) {
let currentSettings = getSettings(camera: currentCamera, flashMode: currentFlashMode)
photoOutput.capturePhoto(with: currentSettings, delegate: self)
}
关于ios - AVCapturePhotoOutput - 设置不能重复使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54084683/
捕获图像时,输出图像的颜色与我在预览图层上看到的颜色不同。出于某种原因,颜色略有变化。有没有人遇到过这个问题?我怎样才能解决这个问题? 当我从 didFinishProcessingPhotoSamp
我正在运行 ios 12 swift 4.2。 我已经实现了一个基本的相机捕捉 session ,并且正在从中点击图像。一切都很好,直到我在自动/开/关模式之间切换闪光灯。单击第一张照片然后更改闪光灯
我的应用程序因崩溃而被拒绝。我无法在本地重现崩溃,但感谢 Apple 提供的崩溃日志,我能够将有问题的代码缩小为: func capturePhoto() { let photoOutputS
使用 AVCapturePhotoOutput 设置自定义相机。配置 AVCapturePhotoOutput 以提供除了主 JPEG 缓冲区之外的预览缓冲区(缩略图)。 问题是我只收到一次预览缓冲区
我一直致力于使用自定义相机,最近升级到 Xcode 8 beta 和 Swift 3。我最初有这个: var stillImageOutput: AVCaptureStillImageOutput?
我有一个带有 SwiftUI 生命周期的简单 SwiftUI 应用程序,我正在尝试使用AVFoundation 自动拍照。我会根据条件或基于计时器 - 但对于这个例子,我只想在启动时拍照并显示它(不是
我正在创建一个相机应用程序,一切运行良好,但上传到 Firebase 的照片的文件大小太大。它们属于 3MB 类别,我希望它们属于 ±600KB 类别。 我设置了 AVCapturePhotoSett
我看到 iOS 10 引入了 AVCapturePhotoOutput 作为处理照片捕获的新类,并且能够通过将两个缓冲区传递给 来在主图像旁边创建预览/缩略图图像AVCapturePhotoCaptu
我正在制作一个自定义相机应用程序,我可以在其中通过 takePhoto 按钮拍摄我的照片,但是 takePhoto 中出现错误,提示 AVCapturePhotoOutput 没有成员“capture
我有一个应用程序设置,可以使用相机拍摄照片(基于计时器)来检测人脸的存在。当我向应用程序提供我已添加到 Assets 中的照片时,检测过程运行良好。然而,当我尝试直接使用相机的输出,甚至在将图像保存到
我正试图摆脱 AVCaptureStillImageOutput 并采用 iOS 10 中引入的 AVCapturePhotoOutput。 但是,我的部署操作系统是 iOS 9.0。 AVCaptu
我正在关注 Apple 的最新示例代码 AVCam Swift,该代码已更新为使用 AVCapture Photo Output。 var isFlashScene: Bool { get } A B
我正在开发相机应用程序。我正在为 ios 10.x 设备使用 AVCapturePhotoOutput,为 10.x 以下设备使用 AVCaptureStillImageOutput。 我在拍摄照片时
请帮我重构这段代码,它不起作用,我在互联网上搜索但没有找到任何解决方案。我不能自己重构它。 这一行: imageOutput.captureStillImageAsynchronously(from:
我目前正在编写一段代码,如下所示: if error == nil && (captureSession?.canAddInput(input))! { captureSession?.add
很好奇,这在 Swift 4 中会是什么? stimageout = AVCapturePhotoOutput() stimageout?.outputSettings = [AVVideoCodec
以 1080 x 1440 分辨率显示预览;使用代码在 iPhone 8 Plus 上获取最大分辨率 (3024 x 4032) 和质量的照片: capturePhotoOutput?.capture
我发现了以下问题,不幸的是其他帖子没有帮助我找到有效的解决方案。 我有一个简单的应用程序可以显示相机预览 (AVCaptureVideoPreviewLayer),其中视频重力已设置为 resizeA
在新的 Xcode 12 中,出现错误:Value of type 'AVCapturePhotoOutput' has no member 'supportedFlashModes'当我尝试联系 h
背景 我使用 AVCaptureSession 和 AVCapturePhotoOutput 将捕获保存为 JPEG 图像。 let captureSession = AVCaptureSession
我是一名优秀的程序员,十分优秀!