在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()
}
基本上代码有效,但有两个问题:
忽略m_overlayImage的alpha分量,即m_overlayImage的半透明部分由render-function呈现为黑色。为什么?如何解决?
有没有办法将m_overlayImage绘制到sampleBuffer中的某个像素位置。目前我只能画到(0,0),即左下角。问题在于,根据文档的界限和#39;应用于叠加图像而不是样本缓冲区。如何将m_overlayImage渲染到样本缓冲区中的某个位置?
由于 克里斯