Рендеринг в семплбуффер через 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()
}
По сути, код работает, но есть две проблемы:
Альфа-компонент m_overlayImage игнорируется, то есть полупрозрачные части m_overlayImage отрисовываются черным с помощью функции render. Зачем? Как обойти?
Есть ли способ нарисовать m_overlayImage в определенной позиции пикселя в sampleBuffer. В настоящее время я могу рисовать только (0,0), то есть в левом нижнем углу. Проблема в том, что в соответствии с документами "границы" применяются к наложенному изображению вместо буфера выборки. Как я могу отобразить мой m_overlayImage на определенную позицию в буфере семплов?
Спасибо Крис