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.