iPhone 3gs 的 AVCaptureSession 仅获取一帧

2023-12-20

我有一段代码,它设置来自相机的捕获会话以使用 OpenCV 处理帧,然后使用从帧生成的 UIImage 设置 UIImageView 的图像属性。当应用程序启动时,图像视图的图像为零,并且不会显示任何帧,直到我将另一个视图控制器推入堆栈然后将其弹出。然后图像保持不变,直到我再次这样做。 NSLog 语句显示回调以大约正确的帧速率被调用。有什么想法为什么它不显示吗?我将帧速率一直降低到每秒 2 帧。是处理速度不够快吗?

这是代码:

- (void)setupCaptureSession {
    NSError *error = nil;

    // Create the session
    AVCaptureSession *session = [[AVCaptureSession alloc] init];

    // Configure the session to produce lower resolution video frames, if your 
    // processing algorithm can cope. We'll specify medium quality for the
    // chosen device.
    session.sessionPreset = AVCaptureSessionPresetLow;

    // Find a suitable AVCaptureDevice
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    // Create a device input with the device and add it to the session.
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device 
                                                                        error:&error];
    if (!input) {
        // Handling the error appropriately.
    }
    [session addInput:input];

    // Create a VideoDataOutput and add it to the session
    AVCaptureVideoDataOutput *output = [[[AVCaptureVideoDataOutput alloc] init] autorelease];
    output.alwaysDiscardsLateVideoFrames = YES;
    [session addOutput:output];

    // Configure your output.
    dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);
    [output setSampleBufferDelegate:self queue:queue];
    dispatch_release(queue);

    // Specify the pixel format
    output.videoSettings = 
    [NSDictionary dictionaryWithObject:
     [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] 
                                forKey:(id)kCVPixelBufferPixelFormatTypeKey];


    // If you wish to cap the frame rate to a known value, such as 15 fps, set 
    // minFrameDuration.
    output.minFrameDuration = CMTimeMake(1, 1);

    // Start the session running to start the flow of data
    [session startRunning];

    // Assign session to an ivar.
    [self setSession:session];
}

// Create a UIImage from sample buffer data
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer {
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    // Lock the base address of the pixel buffer
    CVPixelBufferLockBaseAddress(imageBuffer,0);

    // Get the number of bytes per row for the pixel buffer
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    // Get the pixel buffer width and height
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    // Create a device-dependent RGB color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    if (!colorSpace) 
     {
        NSLog(@"CGColorSpaceCreateDeviceRGB failure");
        return nil;
     }

    // Get the base address of the pixel buffer
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
    // Get the data size for contiguous planes of the pixel buffer.
    size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer); 

    // Create a Quartz direct-access data provider that uses data we supply
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize, 
                                                              NULL);
    // Create a bitmap image from data supplied by our data provider
    CGImageRef cgImage = 
    CGImageCreate(width,
                  height,
                  8,
                  32,
                  bytesPerRow,
                  colorSpace,
                  kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
                  provider,
                  NULL,
                  true,
                  kCGRenderingIntentDefault);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    // Create and return an image object representing the specified Quartz image
    UIImage *image = [UIImage imageWithCGImage:cgImage];
    CGImageRelease(cgImage);

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);

    return image;
}


// Delegate routine that is called when a sample buffer was written
- (void)captureOutput:(AVCaptureOutput *)captureOutput 
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
       fromConnection:(AVCaptureConnection *)connection {
    // Create a UIImage from the sample buffer data
    UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
    [self.delegate cameraCaptureGotFrame:image];
}

这可能与线程有关 - 尝试:

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

iPhone 3gs 的 AVCaptureSession 仅获取一帧 的相关文章

  • ios 在后台处理推送通知

    我想保存应用程序处于后台状态时到达的推送通知 我知道关于 void application UIApplication application didReceiveRemoteNotification NSDictionary userIn
  • 将 Array Obj-c 的内容转储到控制台

    我寻找了如何转储和数组到我主要找到的控制台 for id name in arrayStuff NSLog Array contents d name 我尝试了不同的格式化程序 d g 等 它们确实打印了不同的内容 但不是我 99 确信被输
  • 在带有 Storyboard 的 XCode 4 中以模态方式推送视图时,出现“对开始/结束外观转换的不平衡调用”警告

    在网上进行了一些研究但没有成功后 我来这里向您询问有关我的警告的问题 实际上 我有一个带有导航控制器的视图 V1 我想在 V1 完成加载时推送模态视图 V2 所以我用performSegueWithIdentifier方法 我正在使用故事板
  • iPhone UINavigationBar 使用 [UINavigationBar 外观] 更改所有控制器的字体样式

    我知道我可以单独更改导航栏的字体 如本答案所述 更改导航栏的字体 https stackoverflow com questions 5832036 change the navigation bars font 目前我正在使用一种更全局的
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • 填充 CoreData 创建的 sqlite 数据库

    我有一个由 CoreData 模型自动创建的 sqlite DB 但我的应用程序不会让用户能够将数据写入其中 而是我想用程序所需的所有数据预先填充它 我的问题是 CoreData 创建的 sqlite DB 具有未知的表和字段 这些表和字段
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 在 UIImage 顶部绘制透明圆圈 - iPhone SDK

    我在尝试找出如何在 UIImageView 中的 UIImage 顶部绘制透明圆圈时遇到了很多麻烦 谷歌给了我线索 但我仍然找不到有效的例子 有没有人知道的例子可以证明这一点 最简单的方法就是创建一个半透明的方形 UIView 然后将其图层
  • 拖动时获取MKAnnotation的坐标

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

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • CGImage/UIImage 在 UI 线程上延迟加载会导致卡顿

    我的程序显示一个水平滚动表面 从左到右平铺有 UIImageViews 代码在 UI 线程上运行 以确保新可见的 UIImageView 分配有新加载的 UIImage 加载发生在后台线程上 一切工作几乎都很好 除了每个图像变得可见时出现口
  • 在 swrevealcontroller 之前实现登录屏幕

    我刚刚开始学习 IOS 开发 我已经按照给定的在线教程成功实现了 SWRevealViewController 一切都按预期工作 然后 我决定添加一个登录屏幕 这将是应用程序运行时用户看到的第一个页面 我采取的步骤如下 将 UIViewCo
  • Objective-C中如何使继承的类能够看到父类的隐藏方法[重复]

    这个问题在这里已经有答案了 我有两个类 Class1 和 Class2 第二个类继承自第一个类 我需要重写 Class1 的 update 方法来实现我的目标 继承方法中 update方法的改变是在代码中间进行的 所以我不能使用 超级更新
  • 私人 iPhone 应用程序?

    我有兴趣编写连接到内部网或外部网的应用程序 换句话说 我想为我的客户制作私人应用程序 但我不希望每个人都能够访问它并能够下载它 您知道是否有一种方法可以将企业应用程序仅分发给特定的人 Android 也做同样的事情吗 The iPhone
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • 如何在 iOS 中注册自定义文件类型

    我目前正在创建一个应用程序 我想让用户在其中备份他们的文件 plist m4a 我压缩文件并将扩展名更改为自定义扩展名 专门针对我的应用程序 例如 MyBackup 然后 用户可以通过电子邮件或 iTunes 文件共享进行导出 我已经阅读过
  • 如何将 NSIndexpath 转换为 NSInteger 或简单的 int?

    我需要将 nsindexpath var 转换为 NsInteger 或简单的 int 例如 int rowIndex mGoogleBaseTable selectedRow mGoogleBaseTable is a NSTable t
  • PresentModalViewController 不执行任何操作

    我有一个 UIViewController parent 调用presentModalViewController与另一个 UIViewController child on viewDidLoad If parent没有 UINaviga
  • 使用 Google place API 从 lat long 获取附近的地点

    我正在使用 google place API 即 https maps googleapis com maps api place search json location 33 7167 73 0667 radius 500 type f
  • 对于某些纹理尺寸,glFramebufferTexture2D 在 iPhone 上失败

    当我尝试将纹理附加到帧缓冲区时 glCheckFramebufferStatus 报告某些纹理大小的 GL FRAMEBUFFER UNSUPPORTED 我已经在第二代和第四代 iPod Touch 上进行了测试 两个模型之间失败的纹理尺

随机推荐

  • XCTest相对于SenTestingKit有哪些优势?

    我想在 iOS 中进行单元测试 默认情况下 测试类是使用 Xcode 5 中的 XCTest 框架类创建的 我在早期版本的 iOS 中使用了 SenTestingKit 这两个框架有什么区别 XCTest框架有哪些优势 我用谷歌搜索了相关文
  • 材料表使行在单击时可编辑

    使用材料表 https material table com 库中 我试图使表行可以通过双击进行编辑 单击该行应该与单击操作列最左侧的编辑按钮具有相同的效果 我已成功链接到正确的事件处理程序 现在双击一行时由警报框表示 https code
  • kohana3.0如何彻底删除镜像文件?

    我有一个 kohana3 0 内容和文件管理系统 当用户删除图像时 我希望能够从数据库以及我上传图像的文件夹中完全删除图像 现在我用于图像删除 public function delete id NULL parent delete id
  • gdb - 执行命令n次

    我正在使用 gdb 调试器来运行一个包含循环的程序 让我们坐在 10 中 当我进入循环时 我不想进入它 我知道我可以在循环之后设置第二个断点 而不是 c 继续 但我也记得有可能做类似 n 10 接下来的 10 次 的事情 n 10 不起作用
  • 如何使用 Ansible 创建新分区

    当我在命令行上运行它时 它工作正常 echo e n np n1 n n nw sudo fdisk dev sdb 但在 Ansible 中它不想在 shell 中运行 name partition new disk shell echo
  • 如何在运行时填充 boost::fusion::vector ?

    首先 为与我之前的问题相似而道歉here https stackoverflow com questions 13094535 iterating over boost fusionvector 但我认为我问得不对 我有一个方法 templ
  • 在 .net 2.0 应用程序中加载 .net 3.5 wpf-forms

    我正在尝试在 net 2 0 Windows 窗体应用程序中加载和托管 WPF 控件 仅当安装了 net 3 5 时才应加载 WPF 控件 我找到了一个链接在 MFC 应用程序中托管 WPF 内容 http www codeguru com
  • npm 认为 Node 已经过时了,但事实并非如此

    我正在尝试安装node gyp 我跑 sudo npm install g node gyp 我收到一条错误 提示它需要节点 0 8 0 并提示我正在运行 0 6 12 问题是 我不是 我正在使用 NVM 目前正在运行 0 11 somet
  • 如何将 numpy 数组列表转换为单个 numpy 数组?

    假设我有 LIST array 1 2 3 4 5 array 1 2 3 4 5 1 2 3 4 5 inner lists are numpy arrays 我尝试转变 array 1 2 3 4 5 1 2 3 4 5 1 2 3 4
  • 无法在 Google App Engine 上运行 Flask 调试模式

    我正在使用 Python 2 7 在 Google App Engine 上运行 Flask 0 9 Werkzeug 0 8 3 并且我非常希望运行 Werkzeug 调试器 尝试使用后werkzeug appengine debugge
  • 未知管理员:ComponentInfo - 尝试为生产 Android 设备启用 kiosk 模式?

    我正在尝试为我的设备启用信息亭模式 但收到未知的管理错误 我很确定我成功地将我的应用程序设置为设备所有者 并且我认为这是最后一步 但这个错误给我带来了很多麻烦 清单 我这里有一个接收器 应该将我的应用程序绑定为设备管理员 它还引用了 dev
  • 在javascript中使用window.open()有什么限制吗

    使用有限制吗window open URL 在 JavaScript 中 当我尝试使用打开三个窗口时window open URL 打开第二个窗口后 第三个窗口没有单独打开 但它只是刷新第一个窗口的内容并在其中显示第三个窗口的内容 使用 b
  • Java中showMessageDialog中的frame和null有什么区别?

    假设我有一个 JFrame 类的对象作为框架 我想知道有什么区别 JOptionPane showMessageDialog null message and JOptionPane showMessageDialog frame mess
  • iOS:如何修剪 .aif 音频录制开始和结束时的静音?

    我的应用程序包括用户录制简短消息的功能 我想从录音的开头和结尾删除任何静音 或者更准确地说 任何音量低于给定阈值的音频 我正在使用 AVAudioRecorder 录制音频 并将其保存到 aif 文件中 我在其他地方看到过一些提到的方法 通
  • 使用 2 个索引列表对 2D Numpy 数组进行索引

    我遇到了一个奇怪的情况 我有一个 2D Numpy 数组 x x np random random integers 0 5 20 8 我有 2 个索引器 一个带有行索引 另一个带有列索引 为了索引 X 我必须执行以下操作 row indi
  • 设置 Android RadioGroup 的选定索引

    除了循环遍历子单选按钮并选择检查所选索引处的单选按钮之外 还有其他方法可以在 android 中设置 RadioGroup 的选定索引吗 注意 我在运行时填充单选按钮组 如果您的单选按钮组是在布局 xml 文件中定义的 则可以为每个按钮分配
  • UIcollectionView cellForItemAtIndexPath 仅在 iOS 10 中返回 Null。在 iOS 9 和 iOS 8 中运行良好

    我有一个应用程序 已经愉快地发布了几年了 它在 UICollectionView 中检索 RSS 提要 cellForItemAtIndexPath 方法设置文本并调用数据源方法以从提要中指定的链接加载图像 如果不存在 则加载网页数据并搜索
  • Highcharts 未渲染:React+Typescript+Highcharts

    尝试使用反应来调出高图表 我有多个 fetch api 调用 为了说明 我只添加了 2 个 我将使用其数据在 UI 中呈现某些内容 在此示例中 data1 用于呈现表格 data2 用于呈现高图 我将这些调用的输出存储在状态对象中 当我调用
  • 如何仅通过一个帐户访问我的多语言-MediaWiki?

    我有几个不同语言的维基 如下所示 de myPage org en myPage org es myPage org 我必须使用不同的帐户名和密码登录每个帐户 一旦我更改子域 我就会被注销 登录信息不会被我带走 我在 1 台服务器上使用 3
  • iPhone 3gs 的 AVCaptureSession 仅获取一帧

    我有一段代码 它设置来自相机的捕获会话以使用 OpenCV 处理帧 然后使用从帧生成的 UIImage 设置 UIImageView 的图像属性 当应用程序启动时 图像视图的图像为零 并且不会显示任何帧 直到我将另一个视图控制器推入堆栈然后