菜鸟教程小白 发表于 2022-12-11 18:31:34

ios - 如何在 IOS 相机中启用防抖和 HDR?


                                            <p><p><strong>我做了什么:-</strong></p>

<p>我已尝试启用 <strong>stabilization</strong> 和 <strong>HDR</strong>,但它不起作用。我认为我的方法正确。当我尝试检查当前设备是否支持稳定时和 HDR 在这两种情况下,我在所有设备中都只得到了错误的情况。</p>

<p>如果下面的代码片段有任何错误,请指导我。</p>

<p>提前致谢!!</p>

<p><strong>我的代码片段:-</strong></p>

<pre><code>func createAVSession() throws -&gt; 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(&#34;device?.isVideoHDREnabled\(device?.isVideoHDREnabled)&#34;)
      }

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

      if (device?.isExposureModeSupported(.continuousAutoExposure))! {
            device?.exposureMode = .continuousAutoExposure
            print(&#34;device?.exposureMode\(device?.exposureMode.rawValue)&#34;)
      }
      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(&#34;Failed to set FPS&#34;)
      }

      // 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 =

      //stillImageOutput.isHighResolutionStillImageOutputEnabled = true

      if stillImageOutput.isStillImageStabilizationSupported {
            stillImageOutput.automaticallyEnablesStillImageStabilizationWhenAvailable = true
            print(&#34;stillImageOutput.isStillImageStabilizationActive\(stillImageOutput.isStillImageStabilizationActive)&#34;)
      }

      // 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(&#34;connection.activeVideoStabilizationMode\(connection.activeVideoStabilizationMode.rawValue)&#34;)
            }
      }


      AppLog.LogFunction(object: LOG_End)
      return session
    }
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在稳定问题上对我有用的是在委托(delegate)中对其进行测试。在我的项目中,我使用 <code>AVCaptureVideoDataOutputSampleBufferDelegate</code> 写入文件,因为我在决定写入之前测试像素缓冲区中的某些内容。这是我发现的一个地方,它会说允许稳定。无论如何,这是我为稳定问题所做的。希望对您有所帮助。</p>
<pre><code>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 &amp;&amp; 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
      }
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何在 IOS 相机中启用防抖和 HDR?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/45790345/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/45790345/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何在 IOS 相机中启用防抖和 HDR?