iphone - puedo - transmitir en vivo youtube android
Subir videos de transmisiĆ³n en vivo desde iPhone como Ustream o Qik (2)
No estoy seguro de que puedas hacer eso con HTTP Live Streaming. HTTP Live Streaming segmenta el video en 10 segundos (aprox.) De longitud y crea una lista de reproducción con esos segmentos. Por lo tanto, si desea que el iPhone sea el servidor de secuencias con HTTP Live Streaming, tendrá que encontrar la manera de segmentar el archivo de video y crear la lista de reproducción.
Cómo hacerlo está más allá de mi conocimiento. Lo siento.
¿Cómo se transmiten videos en vivo desde un iPhone a un servidor como Ustream o Qik? Sé que hay algo llamado Http Live Streaming de Apple, pero la mayoría de los recursos que encuentro solo hablan sobre la transmisión de videos desde el servidor al iPhone.
¿El Http Living de Apple está transmitiendo algo que debería usar? ¿O algo mas? Gracias.
No hay una forma incorporada de hacer esto, hasta donde yo sé. Como dices, HTTP Live Streaming es para descargar al iPhone.
La forma en que lo estoy haciendo es implementar una sesión 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 fotograma a través de la red al servidor, que tiene una configuración personalizada para recibirlo.
Aquí está el flujo: https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_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 );
}
EDITAR / ACTUALIZAR
Varias personas han preguntado cómo hacer esto sin enviar los cuadros al servidor uno por uno. La respuesta es compleja ...
Básicamente, en la función didOutputSampleBuffer
anterior, agrega las muestras en un AVAssetWriter
. De hecho, tenía tres escritores de activos activos a la vez (pasado, presente y futuro) administrados en diferentes hilos.
El escritor anterior está en proceso de cerrar el archivo de película y subirlo. El escritor actual está recibiendo los búferes de muestra de la cámara. El futuro escritor está en el proceso de abrir un nuevo archivo de película y prepararlo para datos. Cada 5 segundos, configuro past=current; current=future
past=current; current=future
y reinicia la secuencia.
Esto luego sube videos en trozos de 5 segundos al servidor. Puede unir los videos junto con ffmpeg
si lo desea, o transcodificarlos en transmisiones de transporte MPEG-2 para HTTP Live Streaming. Los datos de video en sí están codificados en H.264 por el escritor del activo, por lo que la transcodificación simplemente cambia el formato del encabezado del archivo.