Как включить стабилизацию и HDR в IOS Camera?

Что я сделал:-

Я попытался включить стабилизацию и HDR, но он не работает. Я думаю, что я был на правильном пути. Когда я пытался проверить, поддерживает ли текущее устройство стабилизацию и HDR, в обоих случаях у меня был только ложный случай на всех устройствах.

Пожалуйста, сообщите мне, если в приведенном ниже фрагменте кода были допущены ошибки.

Заранее спасибо!!

Мой фрагмент кода: -

func createAVSession() throws -> AVCaptureSession {
        AppLog.LogFunction(object: LOG_Start)

        // Start out with low quality
        let session = AVCaptureSession()
        session.sessionPreset = AVCaptureSessionPresetPhoto

        // Input from video camera
        let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
        let currentFormat = device?.activeFormat.isVideoHDRSupported
        try device?.lockForConfiguration()
        if device?.activeFormat.isVideoHDRSupported == true {
            device?.automaticallyAdjustsVideoHDREnabled = false
            device?.isVideoHDREnabled = true
            print("device?.isVideoHDREnabled\(device?.isVideoHDREnabled)")
        }

        if (device?.isFocusModeSupported(.continuousAutoFocus))! {
            device?.focusMode = AVCaptureFocusMode.continuousAutoFocus
            print("device?.focusMode\(device?.focusMode.rawValue)")
        }
        if (device?.isSmoothAutoFocusSupported)! {
            device?.isSmoothAutoFocusEnabled = true
            print("device?.isSmoothAutoFocusEnabled\(device?.isSmoothAutoFocusEnabled)")
        }

        if (device?.isExposureModeSupported(.continuousAutoExposure))! {
            device?.exposureMode = .continuousAutoExposure
            print("device?.exposureMode\(device?.exposureMode.rawValue)")
        }
        device?.unlockForConfiguration()

        let input = try AVCaptureDeviceInput(device: device)
        do {
            try input.device.lockForConfiguration()
            input.device.activeVideoMaxFrameDuration =  CMTimeMake(1, 30)
            input.device.activeVideoMinFrameDuration =  CMTimeMake(1, 30)
            input.device.unlockForConfiguration()
        }
        catch {
            print("Failed to set FPS")
        }

        // Output
        let videoOutput = AVCaptureVideoDataOutput()

        videoOutput.videoSettings = [ kCVPixelBufferPixelFormatTypeKey as AnyHashable: kCVPixelFormatType_32BGRA]
        videoOutput.alwaysDiscardsLateVideoFrames = true
        videoOutput.setSampleBufferDelegate(self, queue: sessionQueue)

        let stillImageOutput: AVCaptureStillImageOutput = AVCaptureStillImageOutput()
        stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]

        //stillImageOutput.isHighResolutionStillImageOutputEnabled = true

        if stillImageOutput.isStillImageStabilizationSupported {
            stillImageOutput.automaticallyEnablesStillImageStabilizationWhenAvailable = true
            print("stillImageOutput.isStillImageStabilizationActive\(stillImageOutput.isStillImageStabilizationActive)")
        }

        // Join it all together
        session.addInput(input)
        session.addOutput(videoOutput)

      if session.canAddOutput(stillImageOutput) {
            session.addOutput(stillImageOutput)
          self.stillImageOutput = stillImageOutput

      }



        if let connection = videoOutput.connection(withMediaType: AVMediaTypeVideo) {
            if connection.isVideoOrientationSupported {
                connection.videoOrientation = .portrait
            }
            if connection.isVideoStabilizationSupported {
                connection.preferredVideoStabilizationMode = .standard
                print("connection.activeVideoStabilizationMode\(connection.activeVideoStabilizationMode.rawValue)")
            }
        }


        AppLog.LogFunction(object: LOG_End)
        return session
    }

1 ответ

Что мне помогло в вопросе стабилизации, так это проверить его в делегате. В моем проекте я использую AVCaptureVideoDataOutputSampleBufferDelegate для записи в мой файл, когда я проверяю определенные вещи в pixelBuffer, прежде чем я решу записать. Это было единственное место, где я мог найти стабилизацию. Во всяком случае, вот как я это сделал для стабилизации. Надеюсь, поможет.

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!){


self.lockQueue.sync {

    if !self.isCapturing || self.isPaused {

        return
    }



    let isVideo = captureOutput is AVCaptureVideoDataOutput

    if(isVideo && self.videoWriter == nil){

        // testing to make sure dealing with video and not audio

        let connection = captureOutput.connection(withMediaType: AVMediaTypeVideo)


        if (connection?.isVideoStabilizationSupported)! {
            connection?.preferredVideoStabilizationMode = AVCaptureVideoStabilizationMode.cinematic
        }

        //other work excluded as irrelevant
    }
}

}

Другие вопросы по тегам