2012-12-13 12 views
8

Sto cercando di eseguire un server di streaming live HTTP su iPhone, che cattura il flusso video dalla telecamera e lo invia al client HTML5 (che supporta HTTP Live Streaming).Server di streaming live HTTP su iPhone

Finora, ho seguito il lavoro. Server

  1. HTTP Live streaming su iOS (scritto in Node.js), che dinamicamente aggiorna il file di indice dall'elenco di Transport Stream (video/MP2T) file generati dal modulo di acquisizione video.
  2. Modulo di acquisizione video, che utilizza AVCaptureMovieFileOutput per produrre una serie di file QuickTime 10 secondi di a 10 secondi (c'è un piccolo intervallo tra , ma è abbastanza piccolo per la mia applicazione).

Quello che mi serve è un convertitore "on-the-fly" che converte ogni file QuickTime in un file Transport Stream (non è necessario modificare la codifica, ho solo bisogno di un contenitore diverso), che collega due moduli sopra.

Sto prendendo questo approccio perché questo è l'unico modo per sfruttare l'encoder video hardware di iPhone per quanto ne so (ho fatto una ricerca abbastanza su questo argomento qui, e sono sicuro al 99% Per favore fatemi sapere se ho torto).

Alcune persone hanno suggerito ffmpeg, ma preferisco usare codice molto più piccolo con licenza MIT (se presente) o scrivere qualcosa da zero (e open-source con licenza MIT).

Sono abbastanza nuovo in questo contenitore multimediale, e sarei davvero grato se qualcuno potesse indicarmi la giusta direzione (codice di esempio, open source, documenti, ...).

+0

Puoi vedere il codice ffmpeg per vedere come è fatto. – vipw

+0

ffmpeg è l'unica soluzione economica, ci sono encoder commerciali ma costano molti soldi. L'HLS creato al telefono sarà un po 'problematico, considerato forse il rtmp, dal momento che sembra che ci siano molti pezzi sul posto. Presumo che le lacune siano perché è necessario leggere i file MOV completi che si stanno generando da avassetwriter. –

risposta

6

Ho postato questo sul forum degli sviluppatori Apple, proseguendo con una discussione vivace (scusate il gioco di parole). Questo era in risposta a qualcuno che ha sollevato una nozione simile.

Penso che mi corregga se sbaglio, e ci danno un esempio di come, se non siete d'accordo che la creazione di un MPEG TS dalla H264 grezzo che si ottiene dal AVCaptureVideoDataOutput non è un compito facile meno che non si transcodificare utilizzando x264 o qualcosa di simile . Supponiamo per un attimo di poter ottenere facilmente i file mpeg ts, quindi sarebbe semplice compilarli in un contenitore m3u8, avviare un piccolo server web e servirli. Per quanto ne so, e ci sono molte molte app che lo fanno, l'uso di tunnel di localhost dal dispositivo non è un problema di rifiuto. Quindi forse in qualche modo potresti generare hls dal dispositivo che interrogo sulle prestazioni che otterresti.

così via per tecnica numero 2 Sempre utilizzando AvCaptureVideoDataOutput, è catturare i fotogrammi, avvolgerli in qualche piccolo protocollo pulito, JSON o forse qualcosa di più esoterico come bencode aprire un socket e inviarli al server. Ahh ... buona fortuna avere una buona rete robusta perché l'invio di frame non compressi anche tramite Wi-Fi richiederà larghezza di banda.

così via per numero tecnica 3.

si scrive un nuovo filmato utilizzando avassetwriter e leggere indietro dal file temporaneo utilizzando funzioni standard C, questo va bene, ma quello che hai è H264 grezzo, il mp4 non è completa quindi non ha alcun moov atomi, ora arriva la parte divertente che rigenera questa intestazione. in bocca al lupo.

così via per tecnica 4 che sembra avere in realtà qualche merito

Noi non creiamo uno ma 2 avassetwriters, gestiamo utilizzando un dispatch_queue gcd, dal momento che dopo avassetwriters di istanza può essere utilizzato una sola volta, iniziamo il il primo su un timer, dopo un periodo predeterminato diciamo 10 secondi iniziamo il secondo mentre abbattiamo il primo. Ora abbiamo una serie di file .mov con atomi moov completi, ognuno di questi conteneva video h264 compresso. Ora possiamo inviarli al server e assemblarli in un unico flusso video completo. In alternativa potremmo usare un semplice streamer che prende i file MOV e li avvolge nel protocollo rtmp usando librtmp e li invia a un media server.

Se potessimo inviare ogni singolo file MOV a un altro dispositivo Apple, ottenendo così la comunicazione tra dispositivo, questa domanda è stata erroneamente interpretata molte volte, localizzare un altro dispositivo iPhone sulla stessa sottorete tramite Wi-Fi è piuttosto semplice e potrebbe essere fatto. Individuare un altro dispositivo su TCP sulla connessione cellulare è quasi magico, se può essere fatto è possibile solo su reti cellulari che utilizzano IP indirizzabili e non tutti i corrieri comuni.

Supponiamo che tu possa, quindi hai un problema aggiuntivo perché i lettori video non saranno in grado di gestire la transizione tra diversi file di film separati. Dovresti scrivere il tuo streaming player probabilmente basato sulla decodifica ffmpeg. (Questo funziona piuttosto bene)

+0

Grazie per l'ottimo riassunto, Michelle. Ho scelto un meccanismo che è molto vicino alla "tecnica 4". Il video è ora abbastanza uniforme su quei limiti di segmento. Sento ancora una piccola lacuna nel suono oltre quei confini e sto cercando di capire come eliminarlo. –

+0

Ma come si usa AVAssetWriter con la fotocamera dell'iPhone? Ho solo sentito di usare la fotocamera con una AVCaptureSession e non puoi usarla con un AVAssetWriter. – sudo

+0

sì, è possibile infatti, è ancora possibile impostare una sessione di acquisizione –