通过带有alpha混合的cicontext渲染到samplebuffer?

时间:2016-07-26 14:54:48

标签: ios swift avfoundation cmsamplebuffer eaglcontext

在captureOutput中我在样本缓冲区中获取视频帧,并且我希望在捕获的帧之上将另一个CIImage进行alpha混合。渲染应该直接进入传递的样本缓冲区。目前我用这个:

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的alpha分量,即m_overlayImage的半透明部分由render-function呈现为黑色。为什么?如何解决?

  2. 有没有办法将m_overlayImage绘制到sampleBuffer中的某个像素位置。目前我只能画到(0,0),即左下角。问题在于,根据文档的界限和#39;应用于叠加图像而不是样本缓冲区。如何将m_overlayImage渲染到样本缓冲区中的某个位置?

  3. 由于 克里斯

0 个答案:

没有答案