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-DateiEntwicklun
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 zuzugreifenEntwicklun
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 wurdeEntwicklun
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 OpenCVEntwicklun
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 @ verwendEntwicklun
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 AirEntwicklun
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 WebrtcEntwicklun
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.