gpt4 book ai didi

ios - CVMetalTextureCacheCreateTextureFromImage 总是返回 null

转载 作者:可可西里 更新时间:2023-11-01 04:21:56 27 4
gpt4 key购买 nike

我正在尝试通过 MetalKit 渲染 I420(YCbCr 规划器)

大多数示例都使用来自 Camera 的 CMSampleBuffer,

但我的目标是使用给定的 I420 字节。

我做这样的事情:

let data = NSMutableData(contentsOfURL: NSBundle.mainBundle().URLForResource("yuv_640_360", withExtension: "yuv")!)

// Cache for Y

CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, self.device!, nil, &videoTextureCache)

var pixelBuffer: CVPixelBuffer?

CVPixelBufferCreateWithBytes(kCFAllocatorDefault, Int(size.width), Int(size.height), kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, data.mutableBytes, Int(size.width), nil, nil, [
"kCVPixelBufferMetalCompatibilityKey": true,
"kCVPixelBufferOpenGLCompatibilityKey": true,
"kCVPixelBufferIOSurfacePropertiesKey": []
]
, &pixelBuffer)

// Y texture

var yTextureRef : Unmanaged<CVMetalTexture>?

let yWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0)

let yHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0)

let result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, (videoTextureCache?.takeUnretainedValue())!, pixelBuffer, nil, MTLPixelFormat.R8Unorm, yWidth, yHeight, 0, &yTextureRef);

基本上代码与其他示例几乎相同,但我自己创建了自己的 CVPixelBuffer。

我在创建 CVPixelBuffer 和 CVMetalTexture 时没有出错,

但它总是为 yTexture 返回 null。

如何创建正确的 CVPixelBuffer 并使用它进行渲染?

最佳答案

问题解决了。

iosurface 很重要,我发现如果您通过 CVPixelBufferCreateWithBytes 或 CVPixelBufferCreateWithPlanarBytes 创建 CVPixelBuffer,iosurface 始终为 null。

一旦您使用了 iosurface 为 null 的 CVPixelBuffer,那么 MetalTexture 始终为 null。

应该做这样的事情:

let result = CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_420YpCbCr8Planar, [
String(kCVPixelBufferIOSurfacePropertiesKey): [
"IOSurfaceOpenGLESFBOCompatibility": true,
"IOSurfaceOpenGLESTextureCompatibility": true,
"IOSurfaceCoreAnimationCompatibility": true,
]
], &self.pixelBuffer)

CVPixelBufferLockBaseAddress(self.pixelBuffer!, 0)

for index in 0...2 {

memcpy(CVPixelBufferGetBaseAddressOfPlane(self.pixelBuffer!, index), planesAddress[index], planesWidth[index] * planesHeight[index])

}

CVPixelBufferUnlockBaseAddress(self.pixelBuffer!, 0)

关于ios - CVMetalTextureCacheCreateTextureFromImage 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38120208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com