我转换CMSampleBuffer说法在我AVCaptureVideoDataOuput委托的captureOutput功能为MTLTexture像这样(侧面说明,我已经设置了视频输出kCVPixelFormatType_32BGRA的像素格式):MTLTexture有0 bytesPerRow
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
let width = CVPixelBufferGetWidth(imageBuffer)
let height = CVPixelBufferGetHeight(imageBuffer)
var outTexture: CVMetalTexture? = nil
var textCache : CVMetalTextureCache?
CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, metalDevice, nil, &textCache)
var textureRef : CVMetalTexture?
CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textCache!, imageBuffer, nil, MTLPixelFormat.bgra8Unorm, width, height, 0, &textureRef)
let texture = CVMetalTextureGetTexture(textureRef!)!
print(texture.bufferBytesPerRow)
}
问题是,当我打印每行纹理的字节数时,它总是打印0,这是有问题的,因为我稍后尝试使用本文中的方法将纹理转换回UIImage:https://www.invasivecode.com/weblog/metal-image-processing。为什么我收到的纹理看起来是空的?我知道CMSampleBuffer属性是很好,因为我可以将其转换成一个UIImage并绘制它像这样:
let myPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
let myCIimage = CIImage(cvPixelBuffer: myPixelBuffer!)
let image = UIImage(ciImage: myCIimage)
self.imageView.image = image