카메라 앱에서 preview 만들 때 채택하는 프로토콜 질문

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 광현
      참가자
      • 글작성 : 15
      • 답글작성 : 26

      system camera ui 가 아닌 custom 한 ui 를 가진 camera 앱을 만들기 위핵서 MTKView를 이용해서 애플에서 제공하는 AVCam 과 AVCamFilter 를 보며 공부 및 따라 하는 중입니다. 그래서 AVCapturePreviewLayer를 사용하지 않고 직접 AVCaptureSession, AVCatpureDevice, AVCatpureVideoDataOutput 를 이용해서 구현 중입니다.

      class CameraViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate
      

      AVCaptureVideoDataOutputSampleBufferDelegate 를 채택해서

      func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
      
              guard let videoPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer),
                  let _ = CMSampleBufferGetFormatDescription(sampleBuffer) else {return}
      
              self.metalView.pixelBuffer = videoPixelBuffer
              self.metalView.rotation = .rotate90Degrees
          }
      

      을 구현해서 CVImageBuffer를

      MTKView로 보내서 preview를 구현하고 있는 데 맞는 프로토콜을 채택해서 구현한 것인지 궁금합니다.

      애플 공식 문서 내용은 아래와 같습니다.

      • AVCaptureVideoDataOutputSampleBufferDelegate
      • video data output 으로부터 샘플 버터들을 받아오고, video data output의 상태를 모니터할 수 있는 메쏘드를 제공한다
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
      • 이 게시글은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 580

      AVCapturePreviewLayer를 사용하지 않는 이유가 궁금합니다. 학습 때문에 굳이 피하는 것이라면 사용 자체는 큰 문제 없어보입니다.
      혹시 말씀하신 것처럼 구현 후 성능상에 큰 이슈가 있나요?
      해당 딜리게이트의 메서드 문서의 Discussion을 보면 성능상의 이슈가 발생할 여지들에 대해 말해주고 있는데요, 실제로 사양이 좀 낮은 기기를 가지고 구현하려면 이 부분에 대해 신경쓰셔야 할 것 같습니다.

      • 광현
        참가자
        • 글작성 : 15
        • 답글작성 : 26

        나중에 실시간으로 필터 적용하는 화면을 preview 상에 보이도록 하기 위해서 AVCapturePreviewLayer 사용하지 않고 preview 에 보이도록 하는 것을 공부하는 중입니다

        성능상의 이슈는 아직 문제되지는 않지만 고려해 보겠습니다.

        AVSession을 이용하는 부분은 그럭저럭 따라가며 이해하고 있는 데, MTKView 를 상속해서 구현하는 부분은 좀 많이 어렵네요ㅎㅎ

        특히 샘플 코드에 있는 Shader 나 override func draw(_ rect:) 너무 어렵습니다.

        답변 감사합니다. 🙂

        • 이 답변은 광현에 의해 3 years, 10 months 전에 수정됐습니다.
        • 야곰
          키 마스터
          • 글작성 : 37
          • 답글작성 : 580

          draw(_ rect:) 메서드도 성능상의 이슈를 발생시킬 여지가 크기 때문에 사용할 때 고려할 것들이 많습니다 ㅎㅎ
          UIKit을 사용하지 않고 레이어나 기타 뷰를 활용하는 것이 꽤 큰 리소스 컨트롤이 필요한 경우가 많아요.
          UIKit 요소들은 알아서 캐싱하고 최적화 하는데, 커스텀 드로잉은 그렇지 못하기 때문이에요.
          draw(_ rect:) 메서드의 Discussion 부분Quartz 2D Programming Guide 문서에서도 관련된 내용을 참고해보세요 🙂

1 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom