核心图像-在CMSampleBufferRef上呈现透明图像会导致其周围出现黑框

乔里多

我正在尝试在使用AVFoundation的AVCaptureVideoDataOutput录制的视频上添加水印/徽标。我的类设置为sampleBufferDelegate,并接收CMSamplebufferRefs。我已经对CMSampleBufferRefs CVPixelBuffer应用了一些效果,并将其传递回AVAssetWriter。

左上角的徽标是使用透明PNG交付的。我遇到的问题是,一旦将UIImage的透明部分写入视频,它就会变成黑色。任何人都知道我在做什么错或者会忘记吗?

下面的代码段:

//somewhere in the init of the class;   
 _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
_ciContext = [CIContext contextWithEAGLContext:_eaglContext
                                       options: @{ kCIContextWorkingColorSpace : [NSNull null] }];

//samplebufferdelegate method:
- (void) captureOutput:(AVCaptureOutput *)captureOutput
 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
        fromConnection:(AVCaptureConnection *)connection {

    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(pixelBuffer, 0);

....

UIImage *logoImage = [UIImage imageNamed:@"logo.png"];
CIImage *renderImage = [[CIImage alloc] initWithCGImage:logoImage.CGImage];
CGColorSpaceRef cSpace = CGColorSpaceCreateDeviceRGB();

[_ciContext render:renderImage
   toCVPixelBuffer:pixelBuffer
            bounds: [renderImage extent]
        colorSpace:cSpace];

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
CGColorSpaceRelease(cSpace);

....
}

看起来CIContext没有绘制CIImages alpha。有任何想法吗?

乔里多

对于遇到过相同问题的开发人员:

似乎在GPU上渲染并写入视频的所有内容最终都会在视频中造成黑洞。相反,我删除了上面的代码,创建了CGContextRef,就像在编辑图像时所做的那样,并使用了该上下文。

码:

....
CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

CGContextRef context = CGBitmapContextCreate(CVPixelBufferGetBaseAddress(pixelBuffer),
                                             CVPixelBufferGetWidth(pixelBuffer),
                                             CVPixelBufferGetHeight(pixelBuffer),
                                             8,
                                             CVPixelBufferGetBytesPerRow(pixelBuffer),
                                             CGColorSpaceCreateDeviceRGB(),
                                             (CGBitmapInfo)
                                             kCGBitmapByteOrder32Little |
                                             kCGImageAlphaPremultipliedFirst);

CGRect renderBounds = ...
CGContextDrawImage(context, renderBounds, [overlayImage CGImage]);

CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
CGColorSpaceRelease(cSpace);
....

当然,全球EAGLContext全球范围CIContext不再需要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系debugcn@gmail.com 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

透明图像在xfa.fillXfaForm之后显示为黑框。XFA填充是否支持透明图像?

来自分类Dev

xfa.fillXfaForm之后,透明图像显示为黑框。XFA填充是否支持透明图像?

来自分类Dev

使用核心图像去斑点?

来自分类Dev

如何使透明图像出现在TMenu项上

来自分类Dev

CIFourfoldRotatedTile核心图像过滤器

来自分类Dev

基本核心动画-运动图像

来自分类Dev

使用核心图像进行目标检测

来自分类Dev

使用多个核心批量模糊图像

来自分类Dev

将图像保存到核心数据?

来自分类Dev

核心绘图图捕获为图像

来自分类Dev

在透明图像上单击div

来自分类Dev

在轴上显示透明图像(MATLAB)

来自分类Dev

透明图像上的相交检测

来自分类Dev

Photoshop像透明图像上的背景

来自分类Dev

在 PHP 上合并透明图像

来自分类Dev

如何在半透明图像周围绘制边框?(css)

来自分类Dev

在图像上设置不透明度会导致重叠元素的框阴影消失

来自分类Dev

核心图:带有文字和图像的注释

来自分类Dev

基于图像的核心数据模型关系是否正确?

来自分类Dev

核心图像内核语言的OpenGL坐标系

来自分类Dev

无法将图像保存在核心数据中

来自分类Dev

自定义核心图像滤镜颜色问题

来自分类Dev

在Asp.net核心Razor页面中错误上传图像

来自分类Dev

从核心数据加载图像使NavigationView过渡迅速

来自分类Dev

无法将图像保存在核心数据中

来自分类Dev

基于图像的核心数据模型关系是否正确?

来自分类Dev

核心图形图像混合不会释放内存

来自分类Dev

使用iOS 7中的核心数据下载图像

来自分类Dev

核心图:带有文字和图像的注释

Related 相关文章

热门标签

归档