Рендеринг в семплбуффер через cicontext с альфа-смешением

В captureOutput я получаю видеокадры в буферах сэмплов, и я хочу альфа-смешение другого CIImage поверх захваченных кадров. Рендеринг должен идти напрямую в буфер пропущенных образцов. В настоящее время я использую это:

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

  let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
  let contextImage: CIImage? = CIImage(cvPixelBuffer: imageBuffer!)
  let contextExtent = contextImage!.extent

  // init rendering into CI context
  if (m_eaglContext != EAGLContext.current()) {
    EAGLContext.setCurrent(m_eaglContext)
  }
  m_videoPreviewView.bindDrawable()

  // render overlay into pixel buffer
  m_ciContext.render(m_overlayImage!, to: imageBuffer!, bounds: CGRect(x:0, y:0, width:200, height:200), colorSpace: m_colorspace)

  // display the pixelbuffer into GLKView
  m_ciContext.draw(contextImage!, in: m_videoPreviewViewBounds, from: contextExtent)
  m_videoPreviewView.display()
}

По сути, код работает, но есть две проблемы:

  1. Альфа-компонент m_overlayImage игнорируется, то есть полупрозрачные части m_overlayImage отрисовываются черным с помощью функции render. Зачем? Как обойти?

  2. Есть ли способ нарисовать m_overlayImage в определенной позиции пикселя в sampleBuffer. В настоящее время я могу рисовать только (0,0), то есть в левом нижнем углу. Проблема в том, что в соответствии с документами "границы" применяются к наложенному изображению вместо буфера выборки. Как я могу отобразить мой m_overlayImage на определенную позицию в буфере семплов?

Спасибо Крис

0 ответов

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