ios video-capture avfoundation video-processing core-video

ios - Cómo obtener bytes de CMSampleBufferRef, para enviar a través de la red



video-capture avfoundation (2)

Captue el video usando el marco de trabajo de AVFoundation .Con la ayuda de la documentación 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.Creado AVCaptureDeviceInput y configurar videoCaptureDevice
3.Creado AVCaptureVideoDataOutput y delegado implementado
4.Created AVCaptureSession : establece la entrada como AVCaptureDeviceInput y la salida como AVCaptureVideoDataOutput

5.En el método AVCaptureVideoDataOutput Delegate

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

Obtuve CMSamplebuffer y me convertí en UIImage y lo probé para imprimir UIImageview usando

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

Todo fue bien hasta esto ........

MI problema es, necesito enviar fotogramas de video a través de UDP Socket. Aun cuando seguir uno es una mala idea, lo he intentado, UIImage to NSData y Send via UDP Pocket. BUt tiene tanto Retraso en el procesamiento de video. Problema mayormente debido a UIImage a NSDate

Así que por favor, dame una solución para mi problema

1) ¿Alguna forma de convertir CMSampleBUffer o CVImageBuffer a NSData?
2) Me gusta el servicio de cola de audio y la cola de video para almacenar UIImage y hacer UIImage a NSDate And Sending ???

Si estoy detrás del algoritmo incorrecto Por favor, encamíneme en la dirección de escritura.

Gracias por adelantado


Aquí está el código para llegar al búfer. Este código asume una imagen plana (por ejemplo, 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 usar un NSMutableData o un grupo de búferes.

El envío de una imagen de 480x360 cada segundo requerirá una conexión de 4.1Mbps asumiendo 3 canales de color.


Use CMSampleBufferGetImageBuffer para obtener CVImageBufferRef desde el búfer de muestra, luego obtenga los datos de mapa de bits con CVPixelBufferGetBaseAddress . Esto evita copiar innecesariamente la imagen.