vídeo por organizar ordenar hacer fotos fecha cómo como carrete iphone objective-c ffmpeg

por - ¿Cómo obtener una transmisión de video en tiempo real desde la cámara del iPhone y enviarla al servidor?



organizar carrete iphone (3)

Estoy utilizando AVCaptureSession para capturar video y obtener imágenes en tiempo real desde la cámara del iPhone, pero ¿cómo puedo enviarlo al servidor con multiplexación de imágenes y sonido y cómo usar ffmpeg para completar esta tarea, si alguien tiene algún tutorial sobre ffmpeg o cualquier ejemplo? por favor comparte aquí.


Hay una larga y corta historia.

Este es el breve: vaya a https://github.com/OpenWatch/H264-RTSP-Server-iOS

este es un punto de partida

Puedes conseguirlo y ver cómo extrae el marco. Este es un proyecto pequeño y simple.

Luego puede ver kickflip, que tiene una función específica "encodedFrame", su llamada de vuelta y el marco codificado que llega desde este punto u puede hacer lo que quiera con él, enviarlo a través de websocket. Hay un montón de código muy difícil disponible para leer átomos de MPEG


La forma en que lo hago es implementar AVCaptureSession, que tiene un delegado con una devolución de llamada que se ejecuta en cada fotograma. Esa devolución de llamada envía cada marco a través de la red al servidor, que tiene una configuración personalizada para recibirlo.

Aquí está el flujo:

http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2

Y aquí hay un código:

// make input device NSError *deviceError; AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&deviceError]; // make output device AVCaptureVideoDataOutput *outputDevice = [[AVCaptureVideoDataOutput alloc] init]; [outputDevice setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; // initialize capture session AVCaptureSession *captureSession = [[[AVCaptureSession alloc] init] autorelease]; [captureSession addInput:inputDevice]; [captureSession addOutput:outputDevice]; // make preview layer and add so that camera''s view is displayed on screen AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; previewLayer.frame = view.bounds; [view.layer addSublayer:previewLayer]; // go! [captureSession startRunning];

Entonces el delegado del dispositivo de salida (aquí, self) tiene que implementar la devolución de llamada:

-(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer( sampleBuffer ); CGSize imageSize = CVImageBufferGetEncodedSize( imageBuffer ); // also in the ''mediaSpecific'' dict of the sampleBuffer NSLog( @"frame captured at %.fx%.f", imageSize.width, imageSize.height ); }

El envío de marcos sin formato o imágenes individuales nunca funcionará lo suficientemente bien para usted (debido a la cantidad de datos y al número de marcos). Tampoco se puede atender razonablemente desde el teléfono (las redes WWAN tienen todo tipo de cortafuegos). Deberá codificar el video y transmitirlo a un servidor, muy probablemente en un formato de transmisión estándar (RTSP, RTMP). Hay un chip codificador H.264 en el iPhone> = 3GS. El problema es que no está orientado a la secuencia. Es decir, genera los metadatos necesarios para analizar el video en último lugar. Esto te deja con algunas opciones.

1) Obtenga los datos en bruto y use FFmpeg para codificar en el teléfono (usará una tonelada de CPU y batería).

2) Escriba su propio analizador para la salida H.264 / AAC (muy difícil).

3) Grabe y procese en fragmentos (agregará una latencia igual a la longitud de los fragmentos y caerá alrededor de 1/4 de segundo de video entre cada fragmento al iniciar y detener las sesiones).


Mira aquí , y aquí

Intenta capturar video usando el marco de AV Foundation. Cárguelo en su servidor con transmisión HTTP.

También echa un vistazo a una pila otra pila de desbordamiento post abajo

(El post abajo fue encontrado en este enlace aquí)

Lo más probable es que ya sepas ...

1) How to get compressed frames and audio from iPhone''s camera?

No puedes hacer esto. La API de AVFoundation ha evitado esto desde todos los ángulos. Incluso traté de tuberías con nombre, y algunos otros fugaces unix foo. No hay tal suerte. No tienes más remedio que escribirlo en archivo. En su publicación vinculada, un usuario sugiere configurar la devolución de llamada para entregar marcos codificados. Que yo sepa, esto no es posible para los flujos H.264. El delegado de captura entregará imágenes codificadas en un formato de píxel específico. Son los escritores de películas y AVAssetWriter los que hacen la codificación.

2) Encoding uncompressed frames with ffmpeg''s API is fast enough for real-time streaming?

Sí lo es. Sin embargo, tendrá que usar libx264 que lo lleva al territorio GPL. Eso no es exactamente compatible con la tienda de aplicaciones.

Yo sugeriría usar AVFoundation y AVAssetWriter por razones de eficiencia.