Swift HEVC,alpha同时显示所有帧
我正在使用HEVC和alpha制作一个透明背景的视频,基于一堆Swift HEVC,alpha同时显示所有帧,swift,avfoundation,core-graphics,scenekit,core-video,Swift,Avfoundation,Core Graphics,Scenekit,Core Video,我正在使用HEVC和alpha制作一个透明背景的视频,基于一堆NSImages、一个CVPixelBuffer池和AVAssetWriter。NSImage由SCNRenderer的[snapshot][1]方法渲染 要将NSImages转换为CVPixelbuffers以便将它们附加到池中,我首先从池中获取一个新的像素缓冲区,然后使用此代码 CVPixelBufferLockBaseAddress(pixelBuffer,CVPixelBufferLockFlags(rawValue:0))
NSImage
s、一个CVPixelBuffer
池和AVAssetWriter
。NSImage
由SCNRenderer
的[snapshot][1]
方法渲染
要将NSImage
s转换为CVPixelbuffer
s以便将它们附加到池中,我首先从池中获取一个新的像素缓冲区,然后使用此代码
CVPixelBufferLockBaseAddress(pixelBuffer,CVPixelBufferLockFlags(rawValue:0))
让pixelData=CVPixelBufferGetBaseAddress(pixelBuffer)
让colorSpace=CGColorSpaceCreateDeviceRGB()
guard let context=CGContext(
数据:像素数据,
宽度:Int(图像大小宽度),
高度:Int(图像、大小、高度),
比特组件:8,
bytesPerRow:CVPixelBufferGetBytesPerRow(pixelBuffer),
空间:色彩空间,
bitmapInfo:CGImageAlphaInfo.PremultipledFirst.rawValue
)
else{return}
让graphicsContext=NSGraphicsContext(cgContext:context,翻转:false)
NSGraphicsContext.saveGraphicsState()
NSGraphicsContext.current=graphicsContext
绘图(in:CGRect(x:0,y:0,width:image.size.width,height:image.size.height))
NSGraphicsContext.restoreGraphicsState()
CVPixelBufferUnlockBaseAddress(pixelBuffer,CVPixelBufferLockFlags(rawValue:0))
在导出的影片中,颜色看起来不错,透明度也很好
但所有帧都是相互叠加的,如下面的示例所示
旁注:奇怪的是,如果我用金属获得像素缓冲区(使用SCNRender的渲染
方法),但其他一切都保持原样,那么效果很好。这就是为什么我怀疑可能是我的CGContext
出了问题。那我为什么不用金属呢?我很想,但是
如何使用
SCNRender
?金属纹理是否正确清除?(MTLRenderPassDescriptor的颜色附件[0]。loadAction
应该是MTLLoadActionClear
)它在我使用金属时工作。因此,我想知道是否可以用NSImage/CVPixelBuffer金属方法做类似的事情:我调用scnRender的render
并传入commandBuffer NSImage方法:我调用scnRender的snapshot
并将生成的图像转换为CVPixelBuffer
很难理解这个问题以及它可能出现的位置在没有完整代码的情况下失败,但坚持使用金属是个好主意。我也为你的另一个问题发布了答案。你让我很开心。在那里接受了你的答案。SCNRenderer
是如何使用的?金属纹理是否正确清除?(MTLRenderPassDescriptor的颜色附件[0]。loadAction
应该是MTLLoadActionClear
)它在我使用金属时工作。因此,我想知道是否可以用NSImage/CVPixelBuffer金属方法做类似的事情:我调用scnRender的render
并传入commandBuffer NSImage方法:我调用scnRender的snapshot
并将生成的图像转换为CVPixelBuffer
很难理解这个问题以及它可能出现的位置在没有完整代码的情况下失败,但坚持使用金属是个好主意。我也为你的另一个问题发布了答案。你让我很开心。我接受了你的回答。