7

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 と CVMtalTexture を作成してもエラーは発生しませんでしたが、

ただし、yTexture に対しては常に null を返します。

適切な CVPixelBuffer を作成し、それを使用してレンダリングするにはどうすればよいですか?

4

1 に答える 1