Cómo get bytes de CMSampleBufferRef para enviar a través de networking

Estoy capturando video utilizando el marco AVFoundation. Con la ayuda de la documentation de Apple http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html%23//apple_ref/doc/ uid / TP40010188-CH5-SW2

Ahora hice cosas siguientes

1.Creado videoCaptureDevice
2. Crea AVCaptureDeviceInput y establece videoCaptureDevice
3. Crea AVCaptureVideoDataOutput e implementa Delegate
4.Creado AVCaptureSession : configure la input como AVCaptureDeviceInput y configure la salida como AVCaptureVideoDataOutput

5. En el método AVCaptureVideoDataOutput Delegate

 -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 

Conseguí CMSamplebuffer y lo convertí en UIImage Y lo probé para imprimir UIImageview usando

 [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 

Todo fue bien hasta este …

MI problema ES, necesito enviar frameworks de video a través de UDP Socket. Aunque seguir una es una mala idea que he intentado, UIImage a NSData y enviar a través de UDP Pocket. Tarde, hay mucho retraso en el procesamiento de videos. Casi todo es problema debido a UIImage a NSDate

Entonces, por favor, dame solución para mi problema

1) ¿Alguna forma de convertir CMSampleBUffer o CVImageBuffer a NSData ??
2) Me gusta el service de queue de audio y queue para video para almacenar UIImage y hacer UIImage para NSDate y enviar ???

si estoy montando detrás del algorithm equivocado Por favor, sálvame en la dirección de escritura

Gracias por adelantado

Aquí hay un código para get en el búfer. Este código asume una image plana (p. Ej., BGRA).

 NSData* imageToBuffer( CMSampleBufferRef source) { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(source); CVPixelBufferLockBaseAddress(imageBuffer,0); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); size_t width = CVPixelBufferGetWidth(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer); void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer); NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height]; CVPixelBufferUnlockBaseAddress(imageBuffer, 0); return [data autorelease]; } 

Un enfoque más eficiente sería utilizar un NSMutableData o una agrupación de almacenamientos intermedios.

El envío de una image de 480×360 por segundo requerirá una connection de 4.1Mbps suponiendo 3 canales de color.

Use CMSampleBufferGetImageBuffer para get CVImageBufferRef del buffer de muestra, luego obtenga los datos de bitmap de él con CVPixelBufferGetBaseAddress . Esto evita innecesariamente copyr la image.