- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在拍摄 RAW 和 JPEG 照片时收到以下两条错误消息。我无法诊断这些:
Error capturing photo: Error Domain=AVFoundationError- Domain Code=-11800 "The operation could not be completed" Userlnfo={NSLocalizedFailur- eReason=An unknown erroroccurred (42686), NSLocalizedDescription:The operation could not be completed, NSUnderlyingEr- ror=0x1c804bfa0 {Error Domain=NSOSStatusError- Domain Code=-12686 "(null)"}}
还有...
Error capturing photo: Error Domain=AVFoundationError-Domain Code=-11800 The operation could not be completed" UserInfo.{NSLocalized-FailureReason=An unknown error occurred (-16802), NSLocalizedDescription=The operation could not be completed, NSUnderlyingEr-ror=0x1c4243f30 {Error Domain=NSOSStatusError-Domain Code=-16802 "(null)"}}
这似乎是在 AVCapturePhotoCaptureDelegate 中的这个函数之后发生的:
optional func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?)
这些似乎是在重复拍摄照片时随机发生的。
更新
RAW 设置
func updatePhotoSettings () {
self.photoOutput.setPreparedPhotoSettingsArray([])
let newPhotoSettings = AVCapturePhotoSettings(rawPixelFormatType: OSType(self.photoOutput.availableRawPhotoPixelFormatTypes.first!),
processedFormat: [AVVideoCodecKey : AVVideoCodecJPEG])
newPhotoSettings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: self.photoOutput.availablePhotoPixelFormatTypes[0]]
if #available(iOS 11.0, *) {
newPhotoSettings.embeddedThumbnailPhotoFormat = [AVVideoCodecKey: self.photoOutput.availablePhotoCodecTypes[0]]
}
newPhotoSettings.isHighResolutionPhotoEnabled = true
newPhotoSettings.flashMode = self.flashMode
newPhotoSettings.isAutoStillImageStabilizationEnabled = false
newPhotoSettings.livePhotoMovieFileURL = nil
self.photoOutput.photoSettingsForSceneMonitoring = newPhotoSettings
self.photoOutput.setPreparedPhotoSettingsArray([newPhotoSettings])
}
捕获调用:
final func snapImage () {
let photoCaptureDelegate = PhotoCaptureDelegate(with: self.photoOutput.preparedPhotoSettingsArray.first!,
willCapturePhotoAnimation: {
//Shutter animation
DispatchQueue.main.async { [unowned self] in
self.previewView.videoPreviewLayer.opacity = 0
UIView.animate(withDuration: 0.1, animations: {
self.previewView.videoPreviewLayer.opacity = 1
})
}
}, didCapturePhoto: {
//Photo Saved animation
}, completed: { [unowned self] photoCaptureDelegate in
self.inProgressPhotoCaptureDelegates[photoCaptureDelegate.requestedPhotoSettings.uniqueID] = nil
})
self.inProgressPhotoCaptureDelegates[photoCaptureDelegate.requestedPhotoSettings.uniqueID] = photoCaptureDelegate
self.photoOutput.capturePhoto(with: self.photoOutput.preparedPhotoSettingsArray.first!, delegate: photoCaptureDelegate)
DispatchQueue.main.async {
//Goes to update photo settings for next shot
self.updatePhotoSettings()
}
}
}
照片捕获代理
import AVFoundation
import Photos
import MobileCoreServices
class PhotoCaptureDelegate: NSObject, AVCapturePhotoCaptureDelegate {
private(set) var requestedPhotoSettings : AVCapturePhotoSettings
private let willCapturePhotoAnimation : () -> ()
private let didCapturePhoto : () -> ()
private let completed : (PhotoCaptureDelegate) -> ()
private var jpegPhotoData : Data?
private var dngPhotoData : Data?
// MARK: - Initialization
init(with requestedPhotoSettings: AVCapturePhotoSettings,
willCapturePhotoAnimation: @escaping () -> (),
didCapturePhoto: @escaping () -> (),
completed: @escaping (PhotoCaptureDelegate) -> ())
{
self.requestedPhotoSettings = requestedPhotoSettings
self.willCapturePhotoAnimation = willCapturePhotoAnimation
self.didCapturePhoto = didCapturePhoto
self.completed = completed
}
private final func didFinish() {
self.completed(self)
}
// MARK: - Will Capture
final func capture(_ captureOutput: AVCapturePhotoOutput, willCapturePhotoForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings) {
willCapturePhotoAnimation()
}
final func capture(_ output: AVCapturePhotoOutput, willBeginCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings) {
}
// MARK: - iOS 11 Did Finish Photo
@available(iOS 11.0, *)
final func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
if let error = error {
PhotoCaptureDelegate.showError(sentMessage: "Error processing photo: \(error)")
self.didCapturePhoto()
} else {
if photo.isRawPhoto {
self.dngPhotoData = photo.fileDataRepresentation()
return
} else {
if self.jpegPhotoData == nil {
self.jpegPhotoData = photo.fileDataRepresentation()
self.didCapturePhoto()
return
}
}
}
}
// MARK: - Did Finish Capture
final func capture(_ captureOutput: AVCapturePhotoOutput, didFinishCaptureForResolvedSettings resolvedSettings: AVCaptureResolvedPhotoSettings, error: Error?) {
if let error = error {
PhotoCaptureDelegate.showError(sentMessage: "Error capturing photo: \(error)")
didFinish()
return
if PHPhotoLibrary.authorizationStatus() == .authorized {
var temporaryDNGFileURL : URL? = nil
self.dngPhotoData != nil {
temporaryDNGFileURL = URL(fileURLWithPath: NSTemporaryDirectory().appending("\(resolvedSettings.uniqueID).dng"))
do {
try self.dngPhotoData!.write(to: temporaryDNGFileURL!, options: [.atomic])
} catch let error as NSError {
PhotoCaptureDelegate.showError(sentMessage: "Could not write DNG Data: \(error)")
return
}
}
PHPhotoLibrary.shared().performChanges({
let creationRequest = PHAssetCreationRequest.forAsset()
if (self.jpegPhotoData != nil) {
creationRequest.addResource(with: .photo, data: self.jpegPhotoData!, options: nil)
if let temporaryDNGFileURL = temporaryDNGFileURL {
let companionDNGResourceOptions = PHAssetResourceCreationOptions()
companionDNGResourceOptions.shouldMoveFile = true
creationRequest.addResource(with: .alternatePhoto, fileURL: temporaryDNGFileURL, options: companionDNGResourceOptions)
}
}
}, completionHandler: { [unowned self] success, error in
if let error = error {
PhotoCaptureDelegate.showError(sentMessage: "Error occurered while saving photo to photo library: \(error)")
}
if (temporaryDNGFileURL != nil) {
if FileManager.default.fileExists(atPath: temporaryDNGFileURL!.path) {
do {
try FileManager.default.removeItem(at: temporaryDNGFileURL!)
} catch let error as NSError {
PhotoCaptureDelegate.showError(sentMessage: "Could not remove DNG File: \(error)")
}
}
}
})
}
else {
PhotoCaptureDelegate.showError(sentMessage: "Not authorized to save photo")
self.didFinish()
return
}
}
private static func showError (sentMessage: String) {
let alertController = UIAlertController(title: nil, message: sentMessage, preferredStyle: UIAlertControllerStyle.alert)
let cancelAction = UIAlertAction(title: NSLocalizedString("OK", comment: "Alert button title."), style: UIAlertActionStyle.cancel, handler: nil)
alertController.addAction(cancelAction)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window!.rootViewController!.present(alertController, animated: true, completion: nil)
}
}
最佳答案
更新
您在图像捕获完成之前调用 updatePhotoSettings()
,这会导致错误。尝试从完成处理程序或在拍摄图像之前执行此操作。
附注真的 AVFoundation 应该让这个错误更难犯,或者至少更清楚这是行不通的。
之前的错误猜测
您没有展示如何配置重要的 AVCaptureSession
,但是
如果您启用AVCapturePhotoSettings
isHighResolutionPhotoEnabled
,您还需要启用isHighResolutionCaptureEnabled
(可能是highResolutionCaptureEnabled
对你来说——你使用的是什么版本的 swift?):
self.photoOutput.isHighResolutionCaptureEnabled = true
您的 PhotoCaptureDelegate
看起来超出了范围,这无济于事。将其分配给成员变量以延长其生命。
在您的 AVCaptureSession
.photo
预设关于ios - AVFoundation 错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50137282/
我有一个 AVMutableVideoComposition,我正在使用 AVAssetExportSession 导出它,我正在尝试覆盖一个每秒更新一次的自定义时间戳。我应该使用 AVAssetWr
我是 MAC OSX 开发的新手。我想在 OSX 10.7 上使用 AVFoundation 将视频捕获为原始帧。我不明白为相机设备设置特定的视频分辨率,不知何故我使用 VideoSettings 设
使用 AVFoundation/QTKit 如何将多个视频设备同时录制到一个文件中? 我知道如何分别记录它们,但是尝试同时记录它们会导致诸如... “无法添加到 session 中,因为源和目标媒体类
我有一个关于 CoreAudio 和 AVFoundation 的问题。 我使用 CoreAudio 和 AUGraph 和 AudioUnit 构建了一个专业音频应用程序。 我想切换到看起来非常棒的
Apple Watch 能用吗AVFoundation ?更具体地说,可以AVAudioPlayer和 AVAudioRecorder工作? 我正在尝试制作一个应用程序,让您可以将声音录制到 Appl
Apple Watch 可以使用 AVFoundation 吗?更具体地说,AVAudioPlayer 和 AVAudioRecorder 可以工作吗? 我正在尝试制作一个应用程序,让您可以将声音录制
当我创建一个 iOS 项目和“Build Phases -> Link binary with Libraries”时,我添加了 AVFoundation.framework 库并使用 #import
我正在尝试创建一个格式正确的视频文件,用于 Apple 的 HTTP Live Streaming。这是创建文件的代码: // Init the device inputs AVCaptureDevi
我检查了答案,但找不到任何代码..我还登录以查看是否丢失了某些东西,但两个Logg都出现了,但声音没有播放...我也导入了 框架...我不知道我在做什么错我是新手,请帮忙...谢谢 - (void)v
对于这个问题,我只询问在没有外部库的情况下使用 Xcode 和 iOS 的可能性。我已经在探索在另一个 question 中使用 libtiff 的可能性. 问题 数周以来,我一直在筛选堆栈溢出,并为
我正在尝试采用不同的方法来组合视频。我正在为每个转换创建一个新轨道。 此代码的问题在于显示了第一个视频,而其他所有视频都是黑色的。 整个片段的音频覆盖都是正确的。看起来视频没有带入合成中,因为文件的大
回到使用AVAudioPlayer时,使用currentPosition来获取并设置位置,但是当使用AVAudioEngine和AVAudioPlayerNode时会使用什么呢? 最佳答案 AVAud
有人可以帮我将一个图标合并到一个视频中,该视频应该在视频播放时摆动。我已将动画添加到摆动图标,但只有静态图标会合并到视频中。如果有人可以帮助我,我将不胜感激。 我给你我正在使用的代码 //- (voi
Example 你好, 努力旋转此视频以显示在正确的方向并填满整个屏幕。 我无法使用 videocompisition 获取 avasset,但无法使其正常工作。 let videoAsset
如何一次在屏幕上显示多个相机预览? 如果我开始一个新的 AVCaptureSession,另一个就会停止。如果我使用与另一个 session 相同的 session 初始化一个新的 AVCapture
以下是我的录制按钮方法的内容。它创建了所需的文件,但无论我记录多长时间,创建的文件的长度始终为 4kb 和 0 秒,我无法弄清楚为什么它无效。对于averagePowerPerChannel,计量也返
我已经研究这个太久了。 我正在尝试获取 MacOS 网络摄像头数据并在网络摄像头输出的帧上运行 CIDetect。 我知道我需要: 连接 AVCaptureDevice (如输入)到AVCapture
我正在尝试从 CMSampleBufferRef 检索 CVPixelBufferRef,以便更改 CVPixelBufferRef 以动态覆盖水印。 我正在使用 CMSampleBufferGetI
捕获图像时,输出图像的颜色与我在预览图层上看到的颜色不同。出于某种原因,颜色略有变化。有没有人遇到过这个问题?我怎样才能解决这个问题? 当我从 didFinishProcessingPhotoSamp
对于 iOS5 来说可能是一个简单的问题他们将 AVFoundation 的eekToTime 方法更改为如下所示: [avPlayer seekToTime:startTime toleranceB
我是一名优秀的程序员,十分优秀!