Tôi cần lấy CMSampleBuffer cho khung OpenGL. Tôi đang sử dụng điều này:CMSampleBuffer từ OpenGL cho đầu ra video với AVAssestWritter
int s = 1;
UIScreen * screen = [UIScreen mainScreen];
if ([screen respondsToSelector:@selector(scale)]){
s = (int)[screen scale];
}
const int w = viewController.view.frame.size.width/2;
const int h = viewController.view.frame.size.height/2;
const NSInteger my_data_length = 4*w*h*s*s;
// allocate array and read pixels into it.
GLubyte * buffer = malloc(my_data_length);
glReadPixels(0, 0, w*s, h*s, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
// gl renders "upside down" so swap top to bottom into new array.
GLubyte * buffer2 = malloc(my_data_length);
for(int y = 0; y < h*s; y++){
memcpy(buffer2 + (h*s - 1 - y)*4*w*s, buffer + (4*y*w*s), 4*w*s);
}
free(buffer);
CMBlockBufferRef * cm_block_buffer_ref;
CMBlockBufferAccessDataBytes(cm_block_buffer_ref,0,my_data_length,buffer2,*buffer2);
CMSampleBufferRef * cm_buffer;
CMSampleBufferCreate (kCFAllocatorDefault,cm_block_buffer_ref,true,NULL,NULL,NULL,1,1,NULL,0,NULL,cm_buffer);
Tôi nhận được EXEC_BAD_ACCESS cho CMSampleBufferTạo.
Bất kỳ trợ giúp nào được đánh giá cao, cảm ơn bạn.
Cảm ơn bạn. Làm thế nào để có được cm_block_buffer_ref để chứa dữ liệu OpenGL? –
@Matthew - Nhìn vào nó, tôi nghĩ bạn sẽ cần tạo một tệp CVPixelBuffer, sau đó sử dụng 'CMSampleBufferCreateForImageBuffer()' thay vì 'CMSampleBufferCreate()'. Trong thực tế, có lẽ bạn nên sử dụng AVAssetWriterInputPixelBufferAdaptor: http://developer.apple.com/library/ios/#documentation/AVFoundation/Reference/AVAssetWriterInputPixelBufferAdaptor_Class/Reference/Reference.html –
Ồ vâng, tôi đã thêm một câu trả lời của riêng tôi. Tôi đã quản lý để làm cho nó hoạt động (Một chút chậm nhưng sau đó glReadPixels được cho là). Nhưng cảm ơn bạn. –