Y kanalını işlemek için kCVPixelFormatType_420YpCbCr8BiPlanarFullRange biçiminde canlı video çeken bir uygulamanız var.kCVPixelFormatType_420YpCbCr8BiPlanarFullRisge frame to UIImage dönüşümü
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange çift düzlemsel Bileşen Y'CbCr 8-bit 4: 2: Apple belgelerine göre 0, tam aralığı (luma = [0255] kroma = [1.255]). baseAddr, büyük bir CVPlanarPixelBufferInfo_YCbCrBiPlanar yapısına işaret ediyor.
Bu karelerden bazılarını bir UIViewController'da sunmak istiyorum, kCVPixelFormatType_32BGRA biçimine dönüştürmeyi yapmak için herhangi bir API var mı? Apple tarafından sağlanan bu yöntemi ayarlamak için biraz ipucu verebilir misiniz?
// Create a UIImage from sample buffer data
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer {
// Get a CMSampleBuffer's Core Video image buffer for the media data
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer, 0);
// Get the number of bytes per row for the pixel buffer
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
// Get the number of bytes per row for the pixel buffer
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
// Get the pixel buffer width and height
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
// Create a device-dependent RGB color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// Create a bitmap graphics context with the sample buffer data
CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
// Create a Quartz image from the pixel data in the bitmap graphics context
CGImageRef quartzImage = CGBitmapContextCreateImage(context);
// Unlock the pixel buffer
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
// Free up the context and color space
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
// Create an image object from the Quartz image
UIImage *image = [UIImage imageWithCGImage:quartzImage];
// Release the Quartz image
CGImageRelease(quartzImage);
return (image);
}
Teşekkür ederiz!
RGB'ye dönüştürme, yalnızca bir ara adımdır, evet. Çözümünüzdeki sorun, bu API'nın iOS 5.0'da mevcut olmamasıdır. Bunun yerine kullanabileceğim imageWithCVPixelBuffer adlı bir yöntem var, ancak orijinal formatım biplanar olduğu için iki piksel arabellek var. :-(Yine de teşekkürler! – zapador
Üzgünüz, ben yanlış bir şekilde Safari'de yanlış sayfayı yükledim ve orada oturdum, OS yerine CIImage belgelerine bakıyordum. Yeni bir cevap yazacağım. – Tommy
Tommy, kodun için teşekkürler. Birkaç değişiklikle bir şampiyon gibi çalışır.Benim için oy vermek istiyorum ama yeterli bir itibarım yok – zapador