Tôi đang viết một ứng dụng iPhone tạo ảnh tĩnh từ máy ảnh bằng AVFoundation. Đọc hướng dẫn lập trình Tôi đã tìm thấy mã gần như tôi cần làm, vì vậy tôi đang cố gắng "đảo ngược kỹ thuật" và hiểu nó.
Tôi đã tìm thấy một số khó khăn để hiểu phần chuyển đổi CMSampleBuffer thành hình ảnh.
Vì vậy, đây là những gì tôi hiểu và sau đó là mã.
CMSampleBuffer đại diện cho bộ đệm trong bộ nhớ nơi lưu trữ hình ảnh với dữ liệu bổ sung. Sau đó tôi gọi hàm CMSampleBufferGetImageBuffer() để nhận lại CVImageBuffer chỉ với dữ liệu hình ảnh.
Bây giờ có một chức năng mà tôi không hiểu và tôi chỉ có thể tưởng tượng chức năng của nó: CVPixelBufferLockBaseAddress (imageBuffer, 0); Tôi không thể hiểu nếu nó là một "thread khóa" để tránh nhiều hoạt động trên nó hoặc một khóa đến địa chỉ của bộ đệm để tránh những thay đổi trong quá trình hoạt động (và tại sao nó nên thay đổi? .. khung khác, không phải là dữ liệu sao chép ở một vị trí khác?). Phần còn lại của mã rõ ràng với tôi.
Đã cố gắng tìm kiếm trên google nhưng vẫn không tìm thấy gì hữu ích.
Ai đó có thể mang lại ánh sáng không?CVPixelBufferLockBaseĐịa chỉ lý do tại sao? Chụp ảnh tĩnh bằng cách sử dụng AVFoundation
-(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);
}
Cảm ơn, Andrea
Cảm ơn bạn, đó là một đầu mối.Vì trong các hàm được gọi, không có dấu vết nào về sao chép hoặc tạo, tôi bắt đầu nghĩ rằng bộ đệm được truyền theo tham chiếu, do đó là một loại đóng băng bộ nhớ đệm. – Andrea
Tôi đã thêm một số lý do có thể có về lý do tại sao. –
YEP, tôi đoán lý do chính là điểm giữa câu trả lời của bạn và câu trả lời tôi tìm thấy trên github. "Image.lock(), để xóa tất cả các bản cập nhật bộ đệm cho đến khi Image.unlock() được gọi lại" ngôn ngữ không phải là ObjC nhưng ý nghĩa phải giống nhau. – Andrea