Я пишу приложение для iPhone, которое создает неподвижные изображения с камеры с помощью AVFoundation.Читая руководство по программированию, я нашел код, который мне почти необходим, поэтому я пытаюсь «реверсировать» и понять его.Я нашел некоторые трудности, чтобы понять ту часть, которая конвертирует CMSampleBuffer в изображение.Так вот, что я понял, а позже код.CMSampleBuffer представляет буфер в памяти, где хранится изображение с дополнительными данными.Позже я вызываю функцию CMSampleBufferGetImageBuffer (), чтобы получить CVImageBuffer с данными изображения.Теперь есть функция, которую я не понимал, и я могу только представить ее функцию: CVPixelBufferLockBaseAddress (imageBuffer, 0);Я не могу понять, является ли это «блокировкой потока», чтобы избежать многократной операции над ним, или блокировкой адреса буфера, чтобы избежать изменений во время работы (и почему это должно измениться?в другом месте?).Остальная часть кода мне понятна.Пытался искать в Google, но все равно ничего не нашел полезного.Кто-нибудь может принести немного света?
-(UIImage*) getUIImageFromBuffer:(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);
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);
}
Спасибо, Андреа