Android: Aufnahme und Streaming gleichzeitig

Dies ist nicht wirklich eine Frage, sondern eine Darstellung all meiner Versuche, eine der herausforderndsten Funktionen zu lösen, mit denen ich konfrontiert war.

Ich benutze libstreaming Bibliothek zum Streamen von Echtzeitvideos anWowza Server und ich muss es gleichzeitig auf der SD-Karte aufnehmen. Ich präsentiere nachfolgend alle meine Versuche, um neue Ideen aus der Community zu sammeln.

Kopiere Bytes vom Libstreaming-Stream in eine mp4-Datei

Entwicklun

Wir haben eine Interception in der Libstreaming-Bibliothek erstellt, um alle gesendeten Bytes in eine mp4-Datei zu kopieren. Libstreaming sendet die Bytes über einen LocalSocket an den Wowza-Server. Es verwendet MediaRecorder, um auf die Kamera und das Mikrofon des Geräts zuzugreifen, und legt die Ausgabedatei als den Eingabestream des LocalSocket fest. Wir erstellen einen Wrapper um diesen von InputStream ausgehenden Eingabestream und erstellen darin einen Dateiausgabestream. 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.

Behinderun

Wenn wir versucht haben, die Datei zu lesen, ist sie beschädigt. Wir haben festgestellt, dass in der MP4-Datei Metadaten fehlen. Speziell das Moov-Atom. Wir haben versucht, das Schließen des Streams zu verzögern, um Zeit zum Senden dieses Headers zu haben (dies war immer noch eine Vermutung), aber es hat nicht funktioniert. Um die Kohärenz dieser Daten zu testen, haben wir mit einer kostenpflichtigen Software versucht, das Video einschließlich des Headers wiederherzustellen. Es wurde spielbar, aber es war meistens grüner Bildschirm. Dies wurde also eine nicht vertrauenswürdige Lösung. Wir haben auch versucht, "untrunc" zu verwenden, ein kostenloses Open-Source-Kommandozeilenprogramm, das nicht einmal die Wiederherstellung starten konnte, da es kein moov-Atom gab.

Verwenden Sie ffmpeg, das für Android kompiliert wurde, um auf die Kamera zuzugreifen

Entwicklun

FFMPEG hat ein Gradle-Plugin mit einer Java-Oberfläche, 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.

Behinderun

Beim Versuch, auf die Kamera zuzugreifen, wurde die Fehlermeldung "Berechtigung verweigert" angezeigt. Die Problemumgehung besteht darin, das Gerät zu rooten, um auf es zugreifen zu können. Dadurch verlieren die Telefone jedoch ihre Garantie und können beschädigt werden.

Verwenden Sie ffmpeg, das in Kombination mit MediaRecorder für Android kompiliert wurde.

Entwicklun

Wir haben versucht, FFMPEG als MP3-Datei zu streamen, die über MediaRecorder im Telefon aufgezeichnet wird.

Behinderun

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

Verwenden Sie ffmpeg, das mit libstreaming für Android kompiliert wurde

Entwicklun

Libstreaming verwendet LocalServerSocket als Verbindung zwischen der App und dem Server. Wir dachten daher, wir könnten ffmpeg verwenden, das mit der lokalen Adresse von LocalServerSocket verbunden ist, um das Streaming direkt in eine lokale Datei auf der SD-Karte zu kopieren. Unmittelbar nach dem Start des Streamings haben wir auch den Befehl ffmpeg ausgeführt, um die Daten in einer Datei aufzuzeichnen. Mit ffmpeg haben wir geglaubt, dass es eine MP4-Datei auf die richtige Weise erstellen würde, was bedeutet, dass der moov-Atom-Header enthalten ist.

Behinderun

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

Verwende OpenCV

Entwicklun

OpenCV ist eine plattformübergreifende Open-Source-Bibliothek, die Bausteine für Computer-Vision-Experimente und -Anwendungen bietet. Es bietet hochwertige Schnittstellen zum Erfassen, Verarbeiten und Präsentieren von Bilddaten. Es verfügt über eigene APIs für die Verbindung mit der Gerätekamera. Daher haben wir begonnen, diese zu untersuchen, um festzustellen, ob die erforderlichen Funktionen zum gleichzeitigen Streamen und Aufzeichnen vorhanden sind.

Behinderun

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

Kickflip SDK @ verwend

Entwicklun

Kickflip ist ein Media-Streaming-Dienst, der ein eigenes SDK für die Entwicklung in Android und iOS bereitstellt. Anstelle von RTMP, einem neueren Protokoll, wird auch HLS verwendet.

Behinderun

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

Verwenden Sie Adobe Air

Entwicklun

Wir haben andere Entwickler von Apps konsultiert, die bereits im Play Store verfügbar sind und die bereits auf Server übertragen werden.

Behinderun

Bei der Kontaktaufnahme mit diesen Entwicklern versicherten sie, dass es mit dieser Technologie nicht möglich wäre, gleichzeitig aufzuzeichnen und zu streamen. Außerdem müssten wir die gesamte App mit Adobe Air von Grund auf neu erstellen.

AKTUALISIERE Webrtc

Entwicklun

Wir haben angefangen, WebRTC zu verwenden, nachdem wirdieses großartige Projekt. Wir haben den Signalisierungsserver in unseren NODEJS-Server aufgenommen und den Standard-Handshake über den Socket ausgeführt. Wir haben immer noch zwischen lokaler Aufnahme und Streaming über webrtc gewechselt.

Behinderun

Webrtc funktioniert nicht in jeder Netzwerkkonfiguration. Ansonsten handelt es sich bei der Kameraerfassung nur um systemeigenen Code, was den Versuch, die Bytes zu kopieren oder abzufangen, erheblich erschwert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage