Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift HEVC,alpha同时显示所有帧_Swift_Avfoundation_Core Graphics_Scenekit_Core Video - Fatal编程技术网

Swift 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))

我正在使用HEVC和alpha制作一个透明背景的视频,基于一堆
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
很难理解这个问题以及它可能出现的位置在没有完整代码的情况下失败,但坚持使用金属是个好主意。我也为你的另一个问题发布了答案。你让我很开心。我接受了你的回答。