Carica video live streaming da iPhone come Ustream o Qik

Come riprodurre video in streaming da iPhone a server come Ustream o Qik? So che c’è qualcosa chiamato Http Live Streaming da Apple, ma la maggior parte delle risorse che ho trovato parla solo di streaming di video da server a iPhone.

È Http Living di Apple in streaming qualcosa che dovrei usare? O qualcos’altro? Grazie.

Non c’è un modo integrato per farlo, per quanto ne so. Come dici tu, HTTP Live Streaming è per i download su iPhone.

Il modo in cui sto facendo è implementare una AVCaptureSession, che ha un delegato con una callback che viene eseguita su ogni frame. Quella richiamata invia ogni frame sulla rete al server, che ha una configurazione personalizzata per riceverlo.

Ecco il stream: https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2

Ed ecco un codice:

// 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]; 

Quindi il delegato del dispositivo di output (qui, self) deve implementare il callback:

 -(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 ); } 

EDIT / UPDATE

Diverse persone hanno chiesto come fare senza inviare i frame al server uno per uno. La risposta è complessa …

Fondamentalmente, nella funzione didOutputSampleBuffer sopra, si aggiungono gli esempi in un AVAssetWriter . In realtà avevo tre scrittori attivi attivi in ​​un momento (passato, presente e futuro) gestiti su diversi thread.

Il writer precedente sta per chiudere il file del film e caricarlo. Il writer corrente sta ricevendo i buffer di esempio dalla videocamera. Il futuro scrittore sta per aprire un nuovo filmato e prepararlo per i dati. Ogni 5 secondi, ho impostato past=current; current=future past=current; current=future e riavviare la sequenza.

Questo quindi carica video in blocchi di 5 secondi sul server. È ansible unire i video insieme a ffmpeg se lo si desidera, oppure trascriverli in stream di trasporto MPEG-2 per HTTP Live Streaming. I dati video stessi sono codificati H.264 dal writer di asset, quindi la transcodifica cambia semplicemente il formato di intestazione del file.

Non sono sicuro che tu possa farlo con HTTP Live Streaming. HTTP Live Streaming segmenta il video in una lunghezza di 10 secondi (approssimativa) e crea una playlist con tali segmenti. Pertanto, se si desidera che l’iPhone sia il lato server del stream con HTTP Live Streaming, sarà necessario trovare un modo per segmentare il file video e creare la playlist.

Come farlo è al di là della mia conoscenza. Scusate.