IOS / Objective-C: Отображение предварительного просмотра камеры при загрузке без контроллера средства выбора изображений - PullRequest
0 голосов
/ 30 августа 2018

Вместо того, чтобы отображать статическое фотоизображение на экране, запрашивая фотографию профиля, я бы хотел, чтобы экран открывался в режиме живого изображения с камеры. После этого я не возражаю против использования контроллера uipicker для захвата фотографии. Однако я бы хотел, чтобы пользователь сразу увидел что-то, а не статичное изображение.

Нужно ли использовать AVFoundation, как в , этот ответ для Swift или как проще всего это сделать в Objective-C.

Вот некоторый код, использующий AVFoundation в Swift из этого ТАК вопрос , однако я слаб в Swift и хотел бы сделать это в Objective-C;

extension SelfieViewController:  AVCaptureVideoDataOutputSampleBufferDelegate{
    func setupAVCapture(){
        session.sessionPreset = AVCaptureSessionPreset640x480

        let devices = AVCaptureDevice.devices();
        // Loop through all the capture devices on this phone
        for device in devices {
            // Make sure this particular device supports video
            if (device.hasMediaType(AVMediaTypeVideo)) {
                // Finally check the position and confirm we've got the front camera
                if(device.position == AVCaptureDevicePosition.Front) {
                    captureDevice = device as? AVCaptureDevice
                    if captureDevice != nil {
                        beginSession()
                        break
                    }
                }
            }
        }
    }

    func beginSession(){
        var err : NSError? = nil
        var deviceInput:AVCaptureDeviceInput = AVCaptureDeviceInput(device: captureDevice, error: &err)
        if err != nil {
            println("error: \(err?.localizedDescription)")
        }
        if self.session.canAddInput(deviceInput){
            self.session.addInput(deviceInput)
        }

        self.videoDataOutput = AVCaptureVideoDataOutput()
        var rgbOutputSettings = [NSNumber(integer: kCMPixelFormat_32BGRA):kCVPixelBufferPixelFormatTypeKey]
        self.videoDataOutput.alwaysDiscardsLateVideoFrames=true
        self.videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", DISPATCH_QUEUE_SERIAL)
        self.videoDataOutput.setSampleBufferDelegate(self, queue:self.videoDataOutputQueue)
        if session.canAddOutput(self.videoDataOutput){
            session.addOutput(self.videoDataOutput)
        }
        self.videoDataOutput.connectionWithMediaType(AVMediaTypeVideo).enabled = true

        self.previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
        self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

        var rootLayer :CALayer = self.cameraView.layer
        rootLayer.masksToBounds=true
        self.previewLayer.frame = rootLayer.bounds
        rootLayer.addSublayer(self.previewLayer)
        session.startRunning()

    }

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
        // do stuff here
    }

    // clean up AVCapture
    func stopCamera(){
        session.stopRunning()
    }

}

Заранее спасибо за любые предложения.

1 Ответ

0 голосов
/ 30 августа 2018

Я просто перевожу в Obj-C на примере кода. Если вы хотите понять больше, возможно, вы могли бы увидеть мой проект FaceDetectionDemo . Надеюсь, что это поможет вам.

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

  // Select device
  AVCaptureSession *session = [[AVCaptureSession alloc] init];
  if ([[UIDevice currentDevice] userInterfaceIdiom] == 
        UIUserInterfaceIdiomPhone) {
     [session setSessionPreset:AVCaptureSessionPreset640x480];
   } else {
      [session setSessionPreset:AVCaptureSessionPresetPhoto];
   }

   AVCaptureDevice *device = [self findFrontCamera];
   if (nil == device) {
     self.isUsingFrontFacingCamera = NO;
     device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
   }

   // get the input device
   AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput 
       deviceInputWithDevice:device error:&error];
   if (error) {
     session = nil;
     [self teardownAVCapture];
     if ([_delegate 
       respondsToSelector:@selector(FaceDetectionComponentError:error:)]) {
         __weak typeof(self) weakSelf = self;
         dispatch_async(dispatch_get_main_queue(), ^{
             [weakSelf.delegate FaceDetectionComponentError:weakSelf 
                error:error];
        });
    }
     return;
   }

   // add the input to the session
   if ([session canAddInput:deviceInput]) {
      [session addInput:deviceInput];
   }

    // Make a video data output
    self.videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];

    // We want RGBA, both CoreGraphics and OpenGL work well with 'RGBA'
    NSDictionary *rgbOutputSettings = [NSDictionary dictionaryWithObject:
                                   [NSNumber 
      numberWithInt:kCMPixelFormat_32BGRA] forKey: 
       (id)kCVPixelBufferPixelFormatTypeKey];
    [self.videoDataOutput setVideoSettings:rgbOutputSettings];
    [self.videoDataOutput setAlwaysDiscardsLateVideoFrames:YES]; // discard if the data output queue is blocked

   self.videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", 
    DISPATCH_QUEUE_SERIAL);
   [self.videoDataOutput setSampleBufferDelegate:self 
    queue:self.videoDataOutputQueue];

   if ([session canAddOutput:self.videoDataOutput]) {
      [session addOutput:self.videoDataOutput];
   }

   [[self.videoDataOutput connectionWithMediaType:AVMediaTypeVideo] 
     setEnabled:YES];

   self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] 
     initWithSession:session];
   self.previewLayer.backgroundColor = [[UIColor blackColor] CGColor];
   self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspect;

   CALayer *rootLayer = [self.previewView layer];
   [rootLayer setMasksToBounds:YES];
   [self.previewLayer setFrame:[rootLayer bounds]];
   [rootLayer addSublayer:self.previewLayer];
   [session startRunning];
 }

- (AVCaptureDevice *)findFrontCamera {
   AVCaptureDevicePosition desiredPosition = AVCaptureDevicePositionFront;
   for (AVCaptureDevice *d in [AVCaptureDevice 
      devicesWithMediaType:AVMediaTypeVideo]) {
      if ([d position] == desiredPosition) {
         self.isUsingFrontFacingCamera = YES;
         return d;
      }
   }
   return nil;
}

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...