iPhone:AVCaptureSession 捕获输出崩溃(AVCaptureVideoDataOutput)

2023-11-25

我正在捕获视频并将其转换为 CGImage 以对其进行处理。它将工作约 10 秒,收到内存警告,然后崩溃(通常表示数据格式化程序暂时不可用)。有人可以帮我解决这个问题吗?

- (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {

// CONVERT CMSAMPLEBUFFER INTO A CGIMAGE
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

CVPixelBufferLockBaseAddress(imageBuffer,0);


uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);


CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef cgimage = CGBitmapContextCreateImage(newContext);
UIImage *sourceImage= [UIImage imageWithCGImage:cgimage scale:1.0f orientation:UIImageOrientationLeftMirrored];
CGImageRelease(cgimage);
CGContextRelease(newContext);
CGColorSpaceRelease(colorSpace);

CVPixelBufferUnlockBaseAddress(imageBuffer,0);


// ***
// Adding code after this point to do image transformation usually causes it to crash
UIImage *rot = [self scaleAndRotateImage:sourceImage];
self.detectImage = rot;



}

转换图像的代码......

- (UIImage*)scaleAndRotateImage:(UIImage *)image{
    int kMaxResolution = 320; // Or whatever

    CGImageRef imgRef = image.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);
    if (width > kMaxResolution || height > kMaxResolution) {
        CGFloat ratio = width/height;
        if (ratio > 1) {
            bounds.size.width = kMaxResolution;
            bounds.size.height = bounds.size.width / ratio;
        }
        else {
            bounds.size.height = kMaxResolution;
            bounds.size.width = bounds.size.height * ratio;
        }
    }

    CGFloat scaleRatio = bounds.size.width / width;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = image.imageOrientation;
    switch(orient) {

        case UIImageOrientationUp: //EXIF = 1
            transform = CGAffineTransformIdentity;
            break;

        case UIImageOrientationUpMirrored: //EXIF = 2
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;

        case UIImageOrientationDown: //EXIF = 3
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationDownMirrored: //EXIF = 4
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.height);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationLeft: //EXIF = 6
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationRightMirrored: //EXIF = 7
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        case UIImageOrientationRight: //EXIF = 8
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];

    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
        CGContextScaleCTM(context, -scaleRatio, scaleRatio);
        CGContextTranslateCTM(context, -height, 0);
    }
    else {
        CGContextScaleCTM(context, scaleRatio, -scaleRatio);
        CGContextTranslateCTM(context, 0, -height);
    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //[self setRotatedImage:imageCopy];
    return imageCopy;
}

这个功能只是背景,看看我如何设置视频输出......

AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
[videoOut setAlwaysDiscardsLateVideoFrames:YES];
[videoOut setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; // BGRA is necessary for manual preview
dispatch_queue_t my_queue = dispatch_queue_create("com.example.subsystem.taskXYZ", NULL);
[videoOut setSampleBufferDelegate:self queue:my_queue];
if ([self.captureSession canAddOutput:videoOut]) [self.captureSession addOutput:videoOut];
else NSLog(@"Couldn't add video output");
[videoOut release];

我有类似的问题。最终发生的情况是队列填满了未处理的帧,因为我在委托对象中处理得不够快。

我的解决方案是(每个处理帧一次):

proctr++;
if ((proctr % 20) == 0) {
  deferImageProcessing = true;
  dispatch_sync(queue, ^{
    [self queueFlushed];
  });
}

- (void)queueFlushed {
  deferImageProcessing = false;
}

然后,在实际的图像处理代码中

- (void)captureOutput:(AVCaptureOutput *)captureOutput
     didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
     fromConnection:(AVCaptureConnection *)connection
{ 
  if (deferImageProcessing)
    return;
  // do whatever else I'm doing...
}

本质上,我们偶尔会暂停图像处理,直到队列清空。
我希望这有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone:AVCaptureSession 捕获输出崩溃(AVCaptureVideoDataOutput) 的相关文章

  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • 命令 /Applications/Xcode-beta.app/Contents/Developer/usr/bin/atool 失败,退出代码 255

    它发生在新的 Xcode7 beta 中 CompileAssetCatalog Users admin Library Developer Xcode DerivedData InstaAd ddgdnbxlpxipirebpndfmgr
  • 使用 ZBarSDK 时 iPhone 相机失去自动对焦功能

    我正在开发一个应用程序 用户可以选择是否要扫描条形码或拍摄某物的照片 为了拍照 我正在使用UIImagePickerController照常 为了扫描条形码 我使用 ZbarSDK 1 2ZBarReaderViewController 拍
  • UILabel UILongPressGestureRecognizer 不起作用?

    我怎样才能得到UILongPressGestureRecognizer在 uilabel 当我实现以下代码时 它不会调用该函数 那么请告诉我我做错了什么 UILongPressGestureRecognizer longPress UILo
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • HTML 分页

    有没有html分页的开源项目 我正在为 iPhone 开发一个应用程序 我想在 UIWebView 上显示 HTML 文件 并且不希望用户向下滚动以查看屏幕上未显示的剩余内容 我想在第二个 UIWebView 上显示剩余的内容 我怎样才能做
  • Facebook iPhone SDK:上传图像时显示进度条

    我想在我的 iPhone 应用程序将图像上传到 Facebook 时显示进度条 是否可以 我可以对我发出的每个 FBRequest 执行此操作吗 我还使用 FBRequest 来检查扩展权限 有时需要花费很多时间 谢谢 对于进度条 您可以做
  • iPhone/Objective-C - 呈现视图和委托时的 UIDocumentInteractionController 类参考

    我在用UIDocumentInteractionController在我的应用程序中 以便在我的应用程序中呈现 Instagram 过滤器屏幕 如下所述 http instagram com developer iphone hooks h
  • 是否为 Core Data 的获取结果控制器实现委托

    实现四种委托方法有什么好处 void controllerWillChangeContent NSFetchedResultsController 控制器 void 控制器 NSFetchedResultsController 控制器 di
  • Android:确定 2.2 及更高版本上的摄像头数量

    我的应用程序需要在 Android 2 2 及更高版本上运行 我需要一种方法来确定可用摄像机的数量 有很多帖子解决了这个问题 但我找不到一个有效的 一种解决方案是简单地检测操作系统版本 任何 2 2 版本的设备都仅限于 1 个摄像头 即使该
  • 使用 json 向 RESTful WCF 发送 Post 请求

    我已经尝试了每种组合来发送请求 以从 jQuery 向 RESTful WCF 发送 POST 请求 有人可以模仿并使其发挥作用吗 代码在这里 http pastebin com Ua97919C http pastebin com Ua9
  • 在 iOS 上使用 Web 服务的最佳方式?

    我想构建一个 iOS 应用程序 让您登录到网络服务 之后 应用程序将 当用户选择时 通过 https 发送登录名 密码以及请求的变量 例如 在请求 新闻更新 后 它将收到 XML 格式的请求信息 类似于
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • 当 UITextField 已满或空时显示警报 Swift

    下面的代码中 如果 userNameTF 或 passwordTF 已满或为空 则会显示警报 IBAction func LoginBtn sender AnyObject let userName userNameTF text let
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • 应用内购买产品禁用“提交审核”

    基于此处提到的所有步骤http troybrant net blog 2010 01 in app purchases a full walkthrough http troybrant net blog 2010 01 in app pu
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 拖动时获取MKAnnotation的坐标

    我正在根据用户添加的注释的位置创建一条路径 MKPolyline 我想允许用户通过拖动引脚来更改路径 我目前可以做到这一点 但 MKPolyline 不会更新 直到引脚被放下 我实施了 void mapView MKMapView mapV

随机推荐

  • Rust 的 Arc 和 Rc 类型与垃圾回收有何不同?

    Rust 编程语言 第一版说 Rust 没有垃圾收集器 它无需垃圾收集器即可维持这些目标 然而 在讨论选择您的保证它还说 Rc
  • 根据浏览器大小/调整大小更改高度

    我想知道是否有办法确定浏览器的高度 宽度 我想要做的是 当浏览器尺寸为 1024x768 时 将 div 的高度设置为 500px 对于任何更低的高度 我想将其设置为 400px 如果您使用 jQuery 1 2 或更高版本 您可以简单地使
  • 如何使用 PowerShell 替换文件中的多个字符串

    我正在编写一个用于自定义配置文件的脚本 我想替换该文件中的多个字符串实例 并尝试使用 PowerShell 来完成这项工作 对于单个替换来说它工作得很好 但是进行多个替换非常慢 因为每次它都必须再次解析整个文件 并且这个文件非常大 该脚本如
  • 这个语法“...”(省略号)是什么? [复制]

    这个问题在这里已经有答案了 我在看源代码一个 Blender 插件的版本 我看到了一个新的语法 def elem name ensure class elem clss elem name elem class elem split nam
  • 到达顶部时加载更多

    因为我们可以在以下情况下使用加载更多功能onEndReached 同样的方式 当我们到达列表顶部时 我们如何使用 load more 此外 当我在顶部加载更多数据时 平面列表会移动到最顶部的元素 因此滚动变得无限 thanks 1 您可以使
  • XPath:匹配整个单词(使用带有不区分大小写标志的匹配函数)

    使用 XPath 我想 匹配整个单词 用户选项 就像在 VS 搜索中一样 看起来好像有这样的功能contains and matches尽管匹配允许像这样的标志 但工作方式类似i不区分大小写 换句话说 我通过这两个 XPath 查询得到了相
  • 如何判断函数调用后是否有分号(“;”)?

    在 Matlab 脚本中 我调用用户定义的函数 m 函数 我的函数返回一个值 同时使用以下命令将值打印到命令窗口disp and or fprintf calls 当写一个表达式或一个陈述时 人们把 在其末尾抑制打印 当表达式调用我的函数时
  • MongoDB 我们如何获取所有当前打开的游标以及它们正在运行的查询?

    一些用户打开 mongo 游标并设置 noTimeout 我想列出所有打开的游标 它们的 ID 它们的选项 它们正在运行的查询 该游标的开始时间 最后一次使用它的时间 getmore 有什么命令可以做到这一点吗 有人可以给我一些提示 以便我
  • Azure 移动服务、HttpClient、授权

    我可以使用 NET 的 HttpClient 访问 Azure 移动服务吗 如何使用内置的移动服务进行身份验证自定义身份验证 授权模式使用 HttpClient 这总是返回 401 因为我没有传递任何身份验证凭据 var client ne
  • 如何从 VBScript 调用 C# DLL 函数

    我的脚本位于服务器上 因此我没有可用的 UI 交互 必须使用 DLL 而不是控制台应用程序 如何从 VBScript 调用 C DLL 中的函数 我如何使我的DLL成为COMVisible 我必须注册吗 您需要通过设置将您的程序集标记为 C
  • JQuery ajax() 获取 xml 响应文本

    我正在尝试从 Gmail API 检索一些 XML 到目前为止我有这个 ajax url https mail google com mail feed atom success function data console log data
  • 控制 Java 应用程序中的音量

    我对java相当陌生 我需要在java应用程序中控制音量 音量增大 减小 静音 我找不到办法做到这一点 我正在Linux系统上进行开发 仅供参考 我厌倦了这段代码 Java代码 Port lineIn FloatControl volCtr
  • JavaScript 可以在 window.open 上设置 mime 类型吗

    我正在尝试在 Javascript 中打开一个调试窗口 Javascript 将向调试窗口传递一个 JSON 字符串 其中JSONView Chrome 扩展 应该以格式良好的方式显示 为此 MIME 类型必须是 application j
  • 将 MembershipProvider 注入 ASP.NET MVC AccountController

    ASP NET MVC 1 0 项目模板包括AccountController类 支持构造函数注入 public AccountController IFormsAuthentication formsAuth IMembershipSer
  • Java RMI - 将客户端变成服务器

    如果我想在我的 RMI 应用程序中启用 双向 通信 即允许服务器调用客户端上的方法 以及允许客户端调用服务器上的方法 最简单的方法就是让客户端进入还有远程课程吗 另外 如果我打算将客户端实例作为方法参数传递给服务器 我认为不需要将 客户端类
  • 如何让 Grails 从 Maven 存储库获取最新的本地 jar?

    在我的 Maven 存储库 m2 中 我本地有一个像 sub app 0 1 jar 这样的 jar 我在常春藤缓存中有相同的副本 I run maven install在 sub app 上创建新的 sub app 0 1 jar 文件
  • Resque-Scheduler 无法与 Rails 4.2 中的 ActiveJob 配合使用

    有人能够在 Rails 4 2 中获得预定的工作吗 我正在使用 resque 并且尝试使用 resque scheduler 来安排作业 我有一个已加载的时间表 并且调度程序正在运行 甚至看起来它正在运行作业 但它没有执行任何操作 resq
  • 像聊天一样带有三角形的盒子

    我想用 CSS 制作一个矩形框 后面跟着一个小三角形 就像this 我已经做到了 但我想要与 after 相同的输出 我已经尝试过 但无法打印任何内容 p display inline block padding 5px 6px 8px 6
  • 在 MVC 4 中从数据库填充 Select2 下拉框

    我需要帮助编写 jquery ajax 来填充Select2下拉框 对于那些不知道什么的人Select2是的 它是一个 JavaScript 扩展 用于为 html 选择列表下拉框提供 Twitter Bootstrap 外观和搜索 提前输
  • iPhone:AVCaptureSession 捕获输出崩溃(AVCaptureVideoDataOutput)

    我正在捕获视频并将其转换为 CGImage 以对其进行处理 它将工作约 10 秒 收到内存警告 然后崩溃 通常表示数据格式化程序暂时不可用 有人可以帮我解决这个问题吗 void captureOutput AVCaptureOutput c