账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    47-[AVCaptureVideoDataOutput _updateRemoteQueue:] 偶尔会出现崩溃
    41
    0

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

    调用这个代理方法 偶尔会崩溃 bugly显示如下

    8 AVFoundation -[AVCaptureVideoDataOutput _handleRemoteQueueOperation:] + 344
    9 AVFoundation ___47-[AVCaptureVideoDataOutput _updateRemoteQueue:]_block_invoke + 100
    10 CoreMedia ___FigRemoteOperationReceiverCreateMessageReceiver_block_invoke + 272
    11 CoreMedia ___FigRemoteQueueReceiverSetHandler_block_invoke.2 + 224
    12 libdispatch.dylib __dispatch_client_callout + 16### 问题描述

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    pragma mark 相机相关

    • (AVCaptureSession *)captureSession {
      if (!_captureSession) {

      //创建会话层
      _captureSession = [[AVCaptureSession alloc] init];
      [_captureSession setSessionPreset:AVCaptureSessionPreset1920x1080];

      }
      return _captureSession;

    }

    • (AVCaptureDeviceInput *)captureInput {
      if (!_captureInput) {

      _captureInput = [AVCaptureDeviceInput deviceInputWithDevice:self.captureDevice error:nil];

      }
      return _captureInput;

    }

    • (AVCaptureStillImageOutput *)captureOutput {
      if (!_captureOutput) {

      //创建、配置输出
      _captureOutput = [[AVCaptureStillImageOutput alloc] init];
      NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil];
      [_captureOutput setOutputSettings:outputSettings];

      }
      return _captureOutput;

    }

    • (AVCaptureVideoDataOutput *)captureDataOutput {
      if (!_captureDataOutput) {

      _captureDataOutput = [[AVCaptureVideoDataOutput alloc] init];
      _captureDataOutput.alwaysDiscardsLateVideoFrames = YES;
      dispatch_queue_t queue = dispatch_queue_create("cameraQueue", NULL);
      [_captureDataOutput setSampleBufferDelegate:self queue:queue];
      NSString* formatKey = (NSString*)kCVPixelBufferPixelFormatTypeKey;
      NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];
      NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:formatKey];
      [_captureDataOutput setVideoSettings:videoSettings];

      }
      return _captureDataOutput;

    }

    • (AVCaptureVideoPreviewLayer *)capturePreviewLayer {
      if (!_capturePreviewLayer) {

      _capturePreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession: self.captureSession];
      _capturePreviewLayer.frame = CGRectMake(0,0, ScreenW, ScreenH);
      _capturePreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

      }
      return _capturePreviewLayer;

    }

    • (AVCaptureDevice *)captureDevice {
      if (!_captureDevice) {

      NSArray *deviceArr = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
      for (AVCaptureDevice *device in deviceArr)
      {
          if (device.position == AVCaptureDevicePositionBack){
              _captureDevice = device;
              _captureInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
          }
      }

      }
      return _captureDevice;

    }
    //输入设备

    if ([self.captureSession canAddInput:self.captureInput]) {
        [self.captureSession addInput:self.captureInput];
    }
    //输出设备
    if ([self.captureSession canAddOutput:self.captureDataOutput]) {
        [self.captureSession addOutput:self.captureDataOutput];
    }
    //输出设备
    if ([self.captureSession canAddOutput:self.captureOutput]) {
        [self.captureSession addOutput:self.captureOutput];
    }
    //添加预览层
    [self.view.layer addSublayer:self.capturePreviewLayer];
    
     [self.view.layer addSublayer:self.detectLayer];
     self.view.layer.masksToBounds = YES;
     [self.view addSubview:self.squareView];
    
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 子不语怪兽 普通会员 1楼

      这个函数在Objective-C中用于从远程队列中获取视频数据输出。然而,如果这个函数在运行时崩溃,可能有几种原因:

      1. AVCaptureVideoDataOutput 类的实现可能存在问题。你需要确保你的代码已经正确地实现了这个类,包括初始化方法和相应的错误处理。

      2. AVCaptureVideoDataOutput 的队列可能有问题。你可能需要检查队列的大小是否超过了可用的缓冲区大小。你可以使用 -setQueueName: 方法来改变队列的名字,然后使用 -setMaximumSize: 方法来限制队列的最大大小。

      3. AVCaptureVideoDataOutput 的配置可能存在问题。你可能需要检查配置的正确性,包括设置的输出质量、缓冲区大小、队列的名称等。

      4. 在调用 -updateRemoteQueue:] 函数时,可能有一些资源(如网络连接、文件系统等)正在使用。在这种情况下,你需要确保这些资源都在使用期间。

      5. 如果你的代码是使用 C++ 编写的,那么可能需要检查代码中是否存在内存泄漏或其他问题。

      如果你无法确定问题的原因,你可以尝试在一个新的环境中重现这个问题,然后逐个排查每个可能的问题。如果你仍然无法解决问题,那么可能需要寻求专业的帮助。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部