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.
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.
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.
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.
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.
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).
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.
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.
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.
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
>