Android: Aufnahme und Streaming zur gleichen Zeit

9

Das ist nicht wirklich eine Frage, sondern vielmehr eine Präsentation all meiner Versuche, eine der herausforderndsten Funktionalitäten zu lösen, mit der ich konfrontiert war.

Ich benutze die Bibliothek libstreaming , um Echtzeitvideos zu zu streamen Wowza Server und ich muss es gleichzeitig auf der SD-Karte aufzeichnen. Ich stelle mich unter all meinen Versuchen vor, um neue Ideen aus der Gemeinschaft zu sammeln.

Kopiere Bytes aus dem libstreaming-Stream in eine mp4-Datei

Entwicklung

Wir haben in libstreaming library eine Überwachung erstellt, um alle gesendeten Bytes in eine mp4-Datei zu kopieren. Libstreaming sendet die Bytes über einen LocalSocket an den Wowza-Server. Er ruft MediaRecorder auf, um auf die Kamera und das Mikrofon des Geräts zuzugreifen, und legt die Ausgabedatei als Eingabestrom des LocalSocket fest. Wir erstellen einen Wrapper um diesen Eingabestream, der sich von InputStream aus erstreckt und einen Datei-Ausgabestream darin erstellt. Jedes Mal, wenn libstreaming einen Lesevorgang über den LocaSocket-Eingabestream ausführt, kopieren wir alle Daten in den Ausgabestream und versuchen, eine gültige MP4-Datei zu erstellen.

Behinderung

Wenn wir versucht haben, die Datei zu lesen, ist sie beschädigt. Wir haben festgestellt, dass in der MP4-Datei Metainformationen fehlen. Insbesondere das Moov-Atom. Wir haben versucht, das Schließen des Streams zu verzögern, um Zeit zu geben, diesen Header zu senden (das war immer noch ein Rätsel), aber es hat nicht funktioniert. Um die Kohärenz dieser Daten zu testen, haben wir eine kostenpflichtige Software verwendet, um das Video samt Header wiederherzustellen. Es wurde spielbar, aber es war hauptsächlich grüner Bildschirm. Dies wurde zu einer nicht vertrauenswürdigen Lösung. Wir haben auch versucht, "untrunc" zu verwenden, ein freies Open-Source-Befehlszeilenprogramm, und es konnte nicht einmal die Wiederherstellung starten, da es kein MOOV-Atom gab.

Verwenden Sie ffmpeg kompiliert zu Android, um auf die Kamera zuzugreifen

Entwicklung

FFMPEG hat ein Gradle-Plugin mit einer Java-Schnittstelle, um es in Android-Apps zu verwenden. Wir dachten, wir könnten über die Befehlszeile auf die Kamera zugreifen (wahrscheinlich in "/ dev / video0") und sie an den Medienserver senden.

Behinderung

Beim Versuch, auf die Kamera zuzugreifen, wurde der Fehler "Zugriff verweigert" angezeigt. Die Problemumgehung wäre, das Gerät zu rooten, um Zugriff darauf zu haben, aber es macht die Telefone ihre Garantie verlieren und könnte sie zerteilen.

Verwenden Sie ffmpeg kompiliert zu Android kombiniert mit MediaRecorder

Entwicklung

Wir haben versucht, FFMPEG eine MP4-Datei zu streamen, die im Telefon über MediaRecorder aufgezeichnet wird

Behinderung

FFMPEG kann MP4-Dateien, die noch nicht mit der Aufnahme fertig sind, nicht streamen.

Verwenden Sie ffmpeg kompiliert zu Android mit libstreaming

Entwicklung

Libstreaming verwendet LocalServerSocket als Verbindung zwischen der App und dem Server. Daher dachten wir, wir könnten ffmpeg verwenden, das mit der lokalen LocalServerSocket-Adresse verbunden ist, um das Streaming direkt in eine lokale Datei auf der SD-Karte zu kopieren. Direkt nachdem das Streaming gestartet wurde, haben wir auch den Befehl ffmpeg ausgeführt, um die Daten in eine Datei zu schreiben. Mit ffmpeg glaubten wir, dass es eine MP4-Datei in der richtigen Weise erstellen würde, was bedeutet, dass der Moov-Atom-Header enthalten ist.

Behinderung

Die erstellte "Adresse" kann nicht über die Befehlszeile als lokale Adresse im Telefon gelesen werden. Also die Kopie ist nicht möglich.

Verwenden Sie OpenCV

Entwicklung

OpenCV ist eine plattformübergreifende Open-Source-Bibliothek, die Bausteine ​​für Computer-Vision-Experimente und Anwendungen bereitstellt. Es bietet High-Level-Schnittstellen für die Erfassung, Verarbeitung und Präsentation von Bilddaten. Es verfügt über eigene APIs, um eine Verbindung mit der Kamera des Geräts herzustellen. Daher haben wir begonnen, es zu prüfen, um festzustellen, ob es über die erforderlichen Funktionen zum gleichzeitigen Streamen und Aufzeichnen verfügt.

Behinderung

Wir haben herausgefunden, dass die Bibliothek dafür nicht wirklich definiert ist, sondern eher als bildmathematische Manipulation. Wir haben sogar die Empfehlung, libstreaming zu verwenden (was wir bereits machen).

Verwenden Sie Kickflip SDK

Entwicklung

Kickflip ist ein Media-Streaming-Dienst, der sein eigenes SDK für die Entwicklung von Android und IOS bereitstellt. Es verwendet auch HLS anstelle von RTMP, das ein neueres Protokoll ist.

Behinderung

Ihr SDK erfordert, dass wir eine Aktivität mit einer Kameraansicht erstellen, die den gesamten Bildschirm des Geräts einnimmt und die Benutzerfreundlichkeit unserer App beeinträchtigt.

Verwenden Sie Adobe Air

Entwicklung

Wir haben begonnen, andere Entwickler von Apps, die bereits im Play Store verfügbar sind, zu konsultieren, die bereits auf Server streamen.

Behinderung

Indem sie sich mit diesen Entwicklern in Verbindung setzten, versicherten sie, dass es nicht möglich wäre, mit dieser Technologie gleichzeitig aufzunehmen und zu streamen.Außerdem müssten wir die gesamte App mit Adobe Air von Grund auf neu erstellen.

AKTUALISIEREN

Webrtc

Entwicklung

Wir haben WebRTC nach diesem großartigen Projekt gestartet. Wir haben den Signalisierungsserver in unseren NODEJS-Server integriert und den Standard-Handshake über Socket gestartet. Wir wechselten immer noch zwischen lokaler Aufnahme und Streaming über webrtc.

Behinderung

Webrtc funktioniert nicht in jeder Netzwerkkonfiguration. Abgesehen davon ist der Erwerb der Kamera alles nativer Code, was es sehr viel schwieriger macht, die Bytes zu kopieren oder abzufangen.

    
Bruno Siqueira 12.03.2015, 14:22
quelle

1 Antwort

0

Sobald OpenCV 3.0 verfügbar ist (der RC1 kann heruntergeladen werden hier ), könnten wir eine weitere Option zu dieser Liste hinzufügen:

Mit dem eingebauten Motion-JPEG-Encoder von OpenCV

>     
PhilLab 29.05.2015 08:36
quelle

Tags und Links