GVKun编程网logo

无法使用AVCapturePhotoOutput捕获照片swift + Xcode(br2021提示无法使用camera raw)

15

此处将为大家介绍关于无法使用AVCapturePhotoOutput捕获照片swift+Xcode的详细内容,并且为您解答有关br2021提示无法使用cameraraw的相关问题,此外,我们还将为您介

此处将为大家介绍关于无法使用AVCapturePhotoOutput捕获照片swift + Xcode的详细内容,并且为您解答有关br2021提示无法使用camera raw的相关问题,此外,我们还将为您介绍关于asp.net-mvc-3 – 为什么在使用Azure缓存(.NET MVC3应用程序)时无法组合[Authorize]和[OutputCache]属性?、AVCaptureInput和AVCaptureOutput子类、AVCaptureVideoDataOutputSampleBufferDelegate.CaptureOutput 未在 Swift 中调用、AVCaptureVideoDataOutput在iOS 14中停止传递帧的有用信息。

本文目录一览:

无法使用AVCapturePhotoOutput捕获照片swift + Xcode(br2021提示无法使用camera raw)

无法使用AVCapturePhotoOutput捕获照片swift + Xcode(br2021提示无法使用camera raw)

我正在使用自定义相机应用程序,本教程使用的是iOS 10弃用的AVCaptureStillImageOutput。我已经设置了相机,现在只能使用如何拍照了。

这是我有相机的全景

import UIKitimport AVFoundationvar cameraPos = "back"class View3: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {@IBOutlet weak var clickButton: UIButton!@IBOutlet var cameraView: UIView!var session: AVCaptureSession?var stillImageOutput: AVCapturePhotoOutput?var videoPreviewLayer: AVCaptureVideoPreviewLayer?override func viewDidLoad() {    super.viewDidLoad()        }override func didReceiveMemoryWarning() {    super.didReceiveMemoryWarning()}override func viewDidAppear(_ animated: Bool) {    super.viewDidAppear(animated)    clickButton.center.x = cameraView.bounds.width/2    loadCamera()}override func viewWillAppear(_ animated: Bool) {    super.viewWillAppear(animated) }@IBAction func clickCapture(_ sender: UIButton) {    if let videoConnection = stillImageOutput!.connection(withMediaType: AVMediaTypeVideo) {       // This is where I need help         }}@IBAction func changeDevice(_ sender: UIButton) {    if cameraPos == "back"    {cameraPos = "front"}    else    {cameraPos = "back"}    loadCamera()}func loadCamera(){    session?.stopRunning()    videoPreviewLayer?.removeFromSuperlayer()    session = AVCaptureSession()    session!.sessionPreset = AVCaptureSessionPresetPhoto    var backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .front)    if cameraPos == "back"    {        backCamera = AVCaptureDevice.defaultDevice(withDeviceType: .builtInWideAngleCamera, mediaType: AVMediaTypeVideo, position: .back)    }    var error: NSError?    var input: AVCaptureDeviceInput!    do {        input = try AVCaptureDeviceInput(device: backCamera)    } catch let error1 as NSError {        error = error1        input = nil        print(error!.localizedDescription)    }    if error == nil && session!.canAddInput(input) {        session!.addInput(input)        stillImageOutput = AVCapturePhotoOutput()if session!.canAddOutput(stillImageOutput) {            session!.addOutput(stillImageOutput)            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session)            videoPreviewLayer?.frame = cameraView.bounds            videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill            videoPreviewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait            cameraView.layer.addSublayer(videoPreviewLayer!)            session!.startRunning()        }        }}}

这是我需要帮助的地方

@IBAction func clickCapture(_ sender: UIButton) {if let videoConnection = stillImageOutput!.connection(withMediaType: AVMediaTypeVideo) {   // This is where I need help     }}

我已经在这里回答了如何使用AVCapturePhotoOutput,但是我不明白如何在该代码中合并该代码,因为它涉及到声明一个新类。

答案1

小编典典

你快到了。

输出为 AVCapturePhotoOutput

查看AVCapturePhotoOutput
文档以获取更多帮助。

这些是拍摄照片的步骤。

  1. 创建一个AVCapturePhotoOutput对象。使用其属性来确定支持的捕获设置并启用某些功能(例如,是否捕获实时照片)。
  2. 创建并配置AVCapturePhotoSettings对象以选择特定捕获的功能和设置(例如,启用图像稳定还是闪光灯)。
  3. 通过将照片设置对象capturePhoto(with:delegate:)与实现AVCapturePhotoCaptureDelegate协议的委托对象一起传递给方法来捕获图像 。然后,照片捕获输出将呼叫您的代表,以在捕获过程中将重大事件通知您。

在您的clickCapture方法上具有以下代码,并且不要忘记在类中进行确认和实现委托。

let settings = AVCapturePhotoSettings()let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first!let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,                             kCVPixelBufferWidthKey as String: 160,                             kCVPixelBufferHeightKey as String: 160,                             ]settings.previewPhotoFormat = previewFormatself.cameraOutput.capturePhoto(with: settings, delegate: self)

输出为 AVCaptureStillImageOutput

如果您打算通过视频连接拍摄照片。您可以按照以下步骤操作。

步骤1:建立连线

if let videoConnection = stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {  // ...  // Code for photo capture goes here...}

步骤2:拍摄相片

  • captureStillImageAsynchronouslyFromConnection上调用该函数stillImageOutput
  • sampleBuffer表示被捕捉的数据。

stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: { (sampleBuffer, error) -> Void in  // ...  // Process the image data (sampleBuffer) here to get an image file we can put in our captureImageView})

步骤3:处理图像数据

  • 我们将需要采取一些步骤来处理在sampleBuffer中找到的图像数据,以便最终获得一个UIImage,我们可以将其插入到captureImageView中并在应用程序的其他位置轻松使用。

if sampleBuffer != nil {  let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)  let dataProvider = CGDataProviderCreateWithCFData(imageData)  let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)  let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)  // ...  // Add the image to captureImageView here...}

步骤4:储存图片

根据您的需要将图像保存到照片库或在图像视图中显示


有关更多详细信息,请查看 “ 捕捉照片” 下的“
创建自定义相机视图指南 ”。 __

asp.net-mvc-3 – 为什么在使用Azure缓存(.NET MVC3应用程序)时无法组合[Authorize]和[OutputCache]属性?

asp.net-mvc-3 – 为什么在使用Azure缓存(.NET MVC3应用程序)时无法组合[Authorize]和[OutputCache]属性?

使用Windows Azure的Microsoft.Web.distributedCache.distributedCacheOutputCacheProvider作为MVC3应用程序的outputCache提供程序。以下是相关的操作方法:
[ActionName("sample-cached-page")]
[OutputCache(Duration = 300,varyByCustom = "User",Location = OutputCacheLocation.Server)]
[Authorize(Users = "me@mydomain.tld,another@otherdomain.tld")]
public virtual ActionResult SampleCachedPage()
{
    return View();
}
@H_301_4@从Web浏览器加载此视图时,我会收到以下异常:

System.Configuration.Provider.ProviderException: When using a custom output cache provider like 'distributedCache',only the following expiration policies and cache features are supported: file dependencies,absolute expirations,static validation callbacks and static substitution callbacks.

System.Configuration.Provider.ProviderException: When using a custom output cache provider like 'distributedCache',only the following expiration policies and cache features are supported:  file dependencies,static validation callbacks and static substitution callbacks.
   at System.Web.Caching.OutputCache.InsertResponse(String cachedvaryKey,Cachedvary cachedvary,String rawResponseKey,CachedRawResponse rawResponse,CacheDependency dependencies,DateTime absExp,TimeSpan slidingExp)
   at System.Web.Caching.OutputCacheModule.OnLeave(Object source,EventArgs eventArgs)
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)
@H_301_4@如果我删除[Authorize]属性,视图将按预期缓存。这是否意味着我不能将[OutputCache]放在必须具有[授权]的操作方法上?或者,是否需要使用为缓存使用静态验证回调方法的自定义实现来覆盖AuthorizeAttribute?

@H_301_4@更新1

@H_301_4@在Evan的答案之后,我在IIS Express(Azure外)测试了上述动作方法。以下是对OutputCache属性的varyByCustom =“User”属性的覆盖:

public override string GetvaryByCustomString(HttpContext context,string custom)
{
    return "User".Equals(custom,StringComparison.OrdinalIgnoreCase)
        ? Thread.CurrentPrincipal.Identity.Name
        : base.GetvaryByCustomString(context,custom);
}
@H_301_4@当我访问示例缓存页面为me@mydomain.tld时,该页面的输出被缓存,视图显示“此页被缓存在12/31/2011 11:06:12 AM(UTC)”。如果我以login@otherdomain.tld身份登录并登录,请访问该页面,显示“此页面缓存于12/31/2011 11:06:38 AM(UTC)”。重新登录为me@mydomain.tld并重新访问页面将导致缓存显示“此页面被缓存在12/31/2011 11:06:12 AM(UTC)”。进一步登录/尝试显示不同的输出正在被缓存根据用户返回。

@H_301_4@这导致我相信输出是基于用户单独缓存的,这是我的varyByCustom =“用户”设置&覆盖。问题是它不适用于Azure的分布式缓存提供程序。埃文,你是否回答只有缓存公开的内容呢还是站立的?

@H_301_4@更新2

@H_301_4@我挖出了源代码,发现开箱即用的AuthorizeAttribute实际上有一个非静态的验证回调函数。以下是OnAuthorization的摘录:

if (AuthorizeCore(filterContext.HttpContext)) {
    // ** IMPORTANT **
    // Since we're performing authorization at the action level,the authorization code runs
    // after the output caching module. In the worst case this Could allow an authorized user
    // to cause the page to be cached,then an unauthorized user would later be served the
    // cached page. We work around this by telling proxies not to cache the sensitive page,// then we hook our custom authorization code into the caching mechanism so that we have
    // the final say on whether a page should be served from the cache.

    HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
    cachePolicy.SetProxyMaxAge(new TimeSpan(0));
    cachePolicy.AddValidationCallback(CacheValidateHandler,null /* data */);
}
else {
    HandleUnauthorizedRequest(filterContext);
}
@H_301_4@CacheValidationHandler将缓存验证委托给受保护的虚拟HttpValidationStatus OnCacheAuthorization(HttpContextBase),这当然不是静态的。它不是静态的一个原因是因为,如上面的重要注释中所述,它调用受保护的虚拟bool AuthorizeCore(HttpContextBase)。

@H_301_4@为了从静态缓存验证回调方法中执行任何AuthorizeCore逻辑,它需要知道AuthorizeAttribute实例的Users和Roles属性。但是,似乎并没有一个简单的方法来插入。我必须重写OnAuthorization以将这两个值放入HttpContext(Items集合?)中,然后覆盖OnCacheAuthorization以使它们退出。但是闻起来很脏

@H_301_4@如果我们小心地使用OutputCache属性中的varyByCustom =“User”属性,那么我们只能覆盖OnCacheAuthorization来始终返回HttpValidationStatus.Valid?当action方法没有OutputCache属性时,我们不需要担心这个回调被调用是正确的吗?如果我们有一个没有varyByCustom =“User”的OutputCache属性,那么显而易见的是,页面可以返回任何缓存的版本,而不管用户的请求是创建缓存的副本。这有多风险?

解决方法

缓存发生在Action之前。您可能需要自定义您的授权机制来处理缓存方案。 @H_301_4@查看我发布的一个问题 – MVC Custom Authentication,Authorization,and Roles Implementation。

@H_301_4@我认为这将帮助您的一部分是OnAuthorize()方法处理缓存的自定义授权属性。

@H_301_4@以下是一个代码块,例如:

/// <summary>
/// Uses injected authorization service to determine if the session user 
/// has necessary role privileges.
/// </summary>
/// <remarks>As authorization code runs at the action level,after the 
/// caching module,our authorization code is hooked into the caching 
/// mechanics,to ensure unauthorized users are not served up a 
/// prior-authorized page. 
/// Note: Special thanks to TheCloudlessSky on StackOverflow.
/// </remarks>
public void OnAuthorization(AuthorizationContext filterContext)
{
    // User must be authenticated and Session not be null
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated || filterContext.HttpContext.Session == null)
        HandleUnauthorizedRequest(filterContext);
    else {
        // if authorized,handle cache validation
        if (_authorizationService.IsAuthorized((UserSessionInfoviewmodel)filterContext.HttpContext.Session["user"],_authorizedRoles)) {
            var cache = filterContext.HttpContext.Response.Cache;
            cache.SetProxyMaxAge(new TimeSpan(0));
            cache.AddValidationCallback((HttpContext context,object o,ref HttpValidationStatus status) => AuthorizeCache(context),null);
        }
        else
            HandleUnauthorizedRequest(filterContext);             
    }
}

/// <summary>
/// Ensures that authorization is checked on cached pages.
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
public HttpValidationStatus AuthorizeCache(HttpContext httpContext)
{
    if (httpContext.Session == null)
        return HttpValidationStatus.Invalid;
    return _authorizationService.IsAuthorized((UserSessionInfoviewmodel) httpContext.Session["user"],_authorizedRoles) 
        ? HttpValidationStatus.Valid 
        : HttpValidationStatus.IgnoreThisRequest;
}

AVCaptureInput和AVCaptureOutput子类

AVCaptureInput和AVCaptureOutput子类

1、AVCaptureInput

AVCaptureDeviceInput:用于从AVCaptureDevice对象捕获数据。

 AVCaptureScreenInput:从macOS屏幕上录制的一种捕获输入。

 AVCaptureMetadataInput:它为AVCaptureSession提供AVMetadataItems。AVCaptureMetadataInputs呈现了一个且只有一个AVCaptureInputPort,它目前可能只连接到AVCaptureMovieFileOutput。通过输入端口提供的元数据由客户机提供,并且必须符合客户机提供的CMFormatDescription。AVMetadataItems在AVTimedMetadataGroup中提供。

 

2、AVCaptureOutput

 AVCaptureAudioDataOutput :一种捕获输出,用于记录音频,并在录制音频时提供对音频样本缓冲区的访问。

 AVCaptureAudioPreviewOutput :一种捕获输出,与一个核心音频输出设备相关联、可用于播放由捕获会话捕获的音频。

 AVCaptureDepthDataOutput :在兼容的摄像机设备上记录场景深度信息的捕获输出。

 AVCaptureMetadataOutput :用于处理捕获会话AVCaptureSession产生的定时元数据的捕获输出。

 AVCaptureStillImageOutput :在macOS中捕捉静止照片的捕获输出。该类在iOS 10.0中被弃用,并且不支持新的相机捕获功能,例如原始图像输出和实时照片。在iOS 10.0或更高版本中,使用AVCapturePhotoOutput类代替

 AVCapturePhotoOutput :静态照片、动态照片和其他摄影工作流的捕获输出

 AVCaptureVideoDataOutput :记录视频并提供对视频帧进行处理的捕获输出。

 AVCaptureFileOutput :用于捕获输出的抽象超类,可将捕获数据记录到文件中。

 AVCaptureMovieFileOutput :继承自AVCaptureFileOutput 将视频和音频记录到QuickTime电影文件的捕获输出

 AVCaptureAudioFileOutput :继承自AVCaptureFileOutput,记录音频并将录制的音频保存到文件的捕获输出。

 

AVCaptureVideoDataOutputSampleBufferDelegate.CaptureOutput 未在 Swift 中调用

AVCaptureVideoDataOutputSampleBufferDelegate.CaptureOutput 未在 Swift 中调用

如何解决AVCaptureVideoDataOutputSampleBufferDelegate.CaptureOutput 未在 Swift 中调用?

谁能告诉为什么 this solution 有效?我使用 Swift 有同样的问题,当我在一个独立的 swift 文件中定义我的“扫描仪”时,没有调用 AVCaptureVideoDataOutputSampleBufferDelegate.CaptureOutput 但是,当我在调用 session.addOutput(videoOutput) 和 videoOutput.setSampleBufferDelegate 时在同一个文件中移动扫描仪它有效。

我对 Swift/iOS 开发者很着迷,这个问题让我发疯,最后这个解决方案奏效了。谢谢分享!

只需澄清并添加我的代码:

  1. 我有一个 CamService.swift,我有一个方法来设置 AVCaptureSession:

    session.beginConfiguration()

    // ...

    //添加AVCaptureVideoDataOutput

    如果 session.canAddOutput(videoOutput) { session.addOutput(videoOutput)

    videoOutput.alwaysdiscardsLateVideoFrames = true videoOutput.setSampleBufferDelegate(self,queue:dispatchQueue.global(qos: .userInteractive) ) videoOutput.connections.first?.videoOrientation = .landscapeLeft } 别的 { //fatalError("无法添加视频输出") print("无法将视频输出添加到会话中。") session.commitConfiguration() 返回 }

    // ...

    session.commitConfiguration()

  2. 当我按如下方式扩展 CamService 时,它​​可以工作,可以调用 captureOutput

    扩展CamService:AVCaptureVideoDataOutputSampleBufferDelegate { public func captureOutput(_ output: AVCaptureOutput,didOutput sampleBuffer:CMSampleBuffer,来自连接: AVCaptureConnection) { 打印(“样本缓冲区”) } }

但是,如果我创建一个新的 swift 文件说,

MyDalegate: AVCaptureVideoDataOutputSampleBufferDelegate,

和配置

videoOutput.setSampleBufferDelegate(MyDalegate(),queue:dispatchQueue.global(qos: .userInteractive) )

这不起作用 captureOutput 永远不会被调用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

AVCaptureVideoDataOutput在iOS 14中停止传递帧

AVCaptureVideoDataOutput在iOS 14中停止传递帧

找到了:

我正在获取传入样本缓冲区的附件(元数据),并且由于桥接错误而意外泄漏了字典。

所以代替这个

NSDictionary* attachments = (__bridge NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL,sampleBuffer,kCMAttachmentMode_ShouldPropagate);

我应该做的

NSDictionary* attachments = (__bridge_transfer NSDictionary* _Nullable)CMCopyDictionaryOfAttachments(NULL,kCMAttachmentMode_ShouldPropagate);

有趣的是,此泄漏导致捕获会话在126帧后停止提供新的样本缓冲区-没有任何警告,错误或通知。

关于无法使用AVCapturePhotoOutput捕获照片swift + Xcodebr2021提示无法使用camera raw的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于asp.net-mvc-3 – 为什么在使用Azure缓存(.NET MVC3应用程序)时无法组合[Authorize]和[OutputCache]属性?、AVCaptureInput和AVCaptureOutput子类、AVCaptureVideoDataOutputSampleBufferDelegate.CaptureOutput 未在 Swift 中调用、AVCaptureVideoDataOutput在iOS 14中停止传递帧等相关内容,可以在本站寻找。

本文标签: