Questa non è una domanda tanto quanto una presentazione di tutti i miei tentativi di risolvere una delle funzionalità più impegnative con cui mi sono confrontato.Android: registrazione e streaming allo stesso tempo
Io uso la libreria libstreaming per lo streaming di video in tempo reale su Wowza Server e ho bisogno di registrarlo allo stesso tempo all'interno della scheda SD. Di seguito presenterò tutti i miei tentativi per raccogliere nuove ideologie dalla comunità.
Copia byte dal libstreaming flusso in un file mp4
Sviluppo
Abbiamo creato un intercetto in libstreaming libreria per copiare tutti i byte inviati in un file mp4. Libstreaming invia i byte al server Wowza tramite un LocalSocket. Gli utenti MediaRecorder accedono alla telecamera e al microfono del dispositivo e impostano il file di output come flusso di input del LocalSocket. Quello che facciamo è creare un wrapper attorno a questo flusso di input che si estende da InputStream e creare un flusso di output di file al suo interno. Quindi, ogni volta che libstreaming esegue una lettura sul flusso di input di LocaSocket, copiamo tutti i dati nel flusso di output, cercando di creare un file MP4 valido.
impedimento
Quando abbiamo cercato di leggere il file, è danneggiato. Ci siamo resi conto che mancano le meta-informazioni dal file MP4. Nello specifico l'atomo del moov. Abbiamo provato a ritardare la chiusura dello streaming per dare il tempo di inviare questo header (questo era ancora un indovinello) ma non ha funzionato. Per testare la coerenza di questi dati, abbiamo utilizzato un software a pagamento per provare a recuperare il video, inclusa l'intestazione. È diventato giocabile, ma era principalmente schermo verde. Quindi questa è diventata una soluzione non affidabile. Abbiamo anche provato a utilizzare "untrunc", un programma di riga di comando open source gratuito e non è nemmeno stato possibile avviare il ripristino, poiché non esisteva alcun moov atom.
Usare ffmpeg compilati per Android per accedere alla videocamera
Sviluppo
FFMPEG ha un plugin Gradle con un'interfaccia Java da utilizzare all'interno applicazioni Android. Pensavamo di poter accedere alla telecamera tramite la riga di comando (probabilmente è in "/ dev/video0") e l'abbiamo inviata al media server.
impedimento
Abbiamo ottenuto l'errore "Autorizzazione negata" quando si tenta di accedere alla videocamera. La soluzione alternativa sarebbe quella di fare il root del dispositivo per accedervi, ma fa sì che i telefoni perdano la garanzia e potrebbero bloccarli.
Usare ffmpeg compilati ad Android combinati con MediaRecorder
Sviluppo
Abbiamo cercato di fare FFMPEG flusso di un file mp4 in fase di registrazione all'interno del telefono tramite MediaRecorder
impedimento
FFMPEG non può eseguire lo streaming di file MP4 che non sono ancora stati completati con la registrazione.
Usare ffmpeg compilati per Android con libstreaming
Sviluppo
Libstreaming utilizza LocalServerSocket come il collegamento tra l'applicazione e il server, così abbiamo pensato che avremmo potuto usare ffmpeg collegato con LocalServerSocket indirizzo locale per copiare lo streaming direttamente su un file locale all'interno della scheda SD. Subito dopo lo streaming, abbiamo anche eseguito il comando ffmpeg per iniziare a registrare i dati su un file. Usando ffmpeg, credevamo che avrebbe creato un file MP4 nel modo corretto, il che significa con l'intestazione di moov atom inclusa.
impedimento
L ' "indirizzo" creato non è leggibile tramite linea di comando, come un indirizzo locale all'interno del telefono. Quindi la copia non è possibile.
Usa OpenCV
Sviluppo
OpenCV è un open-source, cross-platform libreria che fornisce blocchi di costruzione per gli esperimenti di visione artificiale e applicazioni. Offre interfacce di alto livello per l'acquisizione, l'elaborazione e la presentazione di dati di immagine. Ha le proprie API per connettersi con la fotocamera del dispositivo, quindi abbiamo iniziato a studiarlo per vedere se aveva le funzionalità necessarie per lo streaming e la registrazione allo stesso tempo.
impedimento
abbiamo scoperto che la biblioteca non è realmente definito per fare questo, ma più come immagine manipolazione matematica. Abbiamo anche la raccomandazione di usare libstreaming (che già facciamo).
Usa Kickflip SDK
Sviluppo
Kickflip è un servizio di streaming multimediale che fornisce il proprio SDK per lo sviluppo di Android e iOS. Utilizza anche HLS anziché RTMP, che è un protocollo più recente.
impedimento
loro SDK richiede che creiamo un'attività con telecamera che occupa l'intero schermo del dispositivo, rompendo la fruibilità della nostra applicazione.
Usa Adobe Air
Sviluppo
Abbiamo iniziato consultando altri sviluppatori di app è già disponibile nel Play Store, che torrente ai server già.
impedimento
Entrare in contatto con gli sviluppatori, hanno rassicurato che non sarebbe possibile registrare e flusso allo stesso tempo con questa tecnologia. Inoltre, dovremmo ripetere l'intera app da zero utilizzando Adobe Air.
UPDATE
WebRTC
Sviluppo
abbiamo iniziato a utilizzare WebRTC seguente this great project. Abbiamo incluso il server di segnalazione nel nostro server NODEJS e abbiamo iniziato a fare l'handshake standard tramite socket. Stavamo ancora alternando la registrazione locale e lo streaming via webrtc.
impedimento
WebRTC non funziona in tutte le configurazioni di rete. Oltre a ciò, l'acquisizione della telecamera è tutto il codice nativo, il che rende molto più difficile provare a copiare i byte o intercettarli.
cine.io sembra simile a kickflip. ma non hanno ancora provato. – sirvon
Grazie per aver pubblicato tutte le tue conclusioni su questo. Sto cercando di fare la stessa cosa che hai fatto nella mia app per Android. In base alla tua esperienza, molti approcci hanno il loro problema. Mi stavo chiedendo se hai trovato una soluzione per lo streaming e la registrazione simultanea di un video? In tal caso, può fornire qualche spiegazione o esempio? – shahins
Sono migrato ora a webRTC in livestream, ma non sta ancora registrando allo stesso tempo. Aggiornerò la lista con queste informazioni extra! –