2012-09-03 11 views
29

Sto usando AVCaptureSession per acquisire video e ottenere frame in tempo reale dalla fotocamera dell'iPhone, ma come posso inviarlo al server con multiplexing di frame e suoni e come usare ffmpeg per completare questa attività, se qualcuno ha qualche tutorial su ffmpeg o qualsiasi esempio si prega di condividere qui.Come ottenere lo streaming video in tempo reale dalla videocamera di iPhone e inviarlo al server?

+1

Suppongo che tu stia già registrando i file "chunk" di MOV/MP4. È possibile eseguire lo streaming di questi utilizzando un vecchio progetto che ho scritto [ffstream] (https://github.com/otmakie/LivuLib) (biforcuto da qualcuno). Tieni presente che devi mantenere un tempo di crescita monotona. In altre parole, l'ora di inizio per ciascun MOV/MP4 deve essere la stessa. In questo modo tutti i file 1 + N avranno lo spazio 'vuoto' all'inizio e i timestamp generati da mov.c in ffmpeg saranno corretti. È possibile utilizzare RTSP/RTP su UDP/TCP o utilizzare il plugin librtmp per ffmpeg per lo streaming. –

+0

@SteveMcFarlin Puoi aiutarmi come inviare lo stream da locale a server, significa come inviare lo stream come un chunk. – Ron

risposta

22

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

Ecco il flusso:

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

Ed ecco qualche 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]; 

Poi delegato del dispositivo di uscita (qui, autonomo) 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); 

    } 

L'invio di frame non elaborati o singole immagini non funzionerà mai bene abbastanza per te (a causa della quantità di dati e numero di frame). Né puoi ragionevolmente servire nulla dal telefono (le reti WWAN hanno tutti i tipi di firewall). Dovrai codificare il video e inviarlo in streaming su un server, molto probabilmente su un formato di streaming standard (RTSP, RTMP). C'è un chip encoder H.264 su iPhone> = 3GS. Il problema è che non è orientato al flusso. Ovvero, emette i metadati necessari per analizzare il video per ultimo. Questo ti lascia con alcune opzioni.

1) Ottenere i dati grezzi e utilizzare FFmpeg per codificare sul telefono (utilizzerà una tonnellata di CPU e batteria).

2) Scrivere il proprio parser per l'output H.264/AAC (molto difficile).

3) Registrare e elaborare in blocchi (aggiungerà una latenza pari alla lunghezza dei blocchi e ridurrà circa 1/4 di secondo del video tra ogni blocco all'avvio e interrompe le sessioni).

+0

, Fino a quello che ho già fatto, grazie per la vostra risposta, la mia domanda è dopo che ho inviato frame audio e video da iphone al server. – Ron

+0

Capisco che questo è vecchio, ma io sono bloccato sul lato server di questo argomento. Come hai configurato il tuo server per gestire il flusso di frame immagine? – Siriss

+0

Pagina non trovata da developer.apple.com. – AechoLiu

4

Look here, and here

Prova di cattura video utilizzando il framework AV Foundation. Caricalo sul tuo server con streaming HTTP.

Verificate anche una pila un altro post di overflow dello stack di seguito

(The post below was found at this link here)

Molto probabilmente già sapete ....

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

È circa Non lo faccio. L'API di AVFoundation ha impedito questo da ad ogni angolo. Ho persino provato pipe nominate, e qualche altro unix fox. Non ho avuto tanta fortuna. Non hai altra scelta che scriverlo in un file. Nel tuo post collegato un utente suggerisce di impostare il callback per consegnare i frame codificati . Per quanto ne so, questo non è possibile per i flussi H.264. Il delegato della cattura fornirà immagini codificate in un formato pixel specifico .Sono Movie Writers e AVAssetWriter che eseguono la codifica .

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

Sì, lo è. Tuttavia, dovrai usare libx264 che ti porterà nel territorio della GPL . Questo non è esattamente compatibile con l'app store.

Si consiglia di utilizzare AVFoundation e AVAssetWriter per motivi di efficienza .

3

C'è una lunga e una breve storia.

Questo è il corto: andare a vedere https://github.com/OpenWatch/H264-RTSP-Server-iOS

questo è un punto di partenza.

si può ottenere e vedere come estrae il telaio. Questo è un progetto piccolo e semplice.

Quindi si può guardare a kickflip che ha una funzione specifica "encodedFrame", le sue richiamate richiamate e il frame codificato arriva da questo punto si può fare ciò che si vuole con esso, inviare tramite websocket. C'è un sacco di codice molto difficile da leggere per gli atomi di mpeg

Problemi correlati