Java, Spring, Kurento und Mediendienste. Teil 2


In einem früheren Artikel habe ich mein Experiment mit der HelloWorld-Anwendung aus dem Kurento-Tutorial beschrieben. In diesem Artikel werde ich weiterhin Webanwendungen in Java Spring und Kurento Media Server-a überprüfen.

Die nächste Anwendung im Tutorial heißt WebRTC Magic Mirror. Aus dem Namen folgt, dass der Spiegel eine leicht verschönerte Realität widerspiegelt. In dieser Anwendung wird zusätzlich zur vorherigen Anwendung der FaceOverlay-Filter des Computer-Vision-Filters verwendet. Wenn ein menschliches Gesicht in der Kamera erkannt wird, setzt der Kurento Media Server eine Super Mario-Kappe auf den Kopf. Wenn das Objektiv mehrere Gesichter enthält, trägt jeder eine Kappe.

Starten Sie Kurento Media Server

sudo service kurento-media-server start 

Wenn Sie das Kurento Java-Tutorial bereits geklont haben, führen Sie den folgenden Befehl nicht aus:

 git clone https://github.com/Kurento/kurento-tutorial-java.git 

Gehen Sie zum Projektverzeichnis

 cd kurento-tutorial-java/kurento-magic-mirror 

Wir stellen das Projekt vom Maven-Team zusammen

 mvn compile exec:java 

Oder, wie in meinem Fall, beginnen wir mit der Idee.

Gehen Sie im Firefox-Browser zu https: // localhost: 8443 /

Klicken Sie im folgenden Fenster auf die Schaltfläche "Start". Es sollte ein Bild angezeigt werden:

Bild
Aus dieser Erfahrung schließen wir: Das Gesicht meiner Katze ähnelt überhaupt keinem menschlichen Gesicht, daher ist die Kappe von Super Mario für ihn nicht geeignet.

Mal sehen, wie dieses Beispiel funktioniert.

Die Anwendungsstruktur wiederholt die vorherige HelloWorld-Anwendung. In der Anwendung interagieren drei Softwareblöcke: auf der Browserseite Java Script-Code, auf der Serverseite die Spring-Boot-Webanwendung, die den Kurento Media Server steuert. Diese Programmblöcke tauschen Nachrichten basierend auf dem Json-Protokoll miteinander aus.

Bild

Das Diagramm zeigt, dass der WebRtcEndpoint-Programmblock in KMS die Übertragung des Multimediasignals nicht mehr für den Empfang umschließt, sondern es zuerst durch den FaceOverlayFilter leitet, der das Vorhandensein eines Gesichts im Bild bestimmt.

Der Signalaustausch zwischen den Programmblöcken ist ungefähr der gleiche wie in der HelloWorld-Anwendung.

Bild

Die Hauptaktionen in der Anwendung werden ausgeführt, wenn Sie auf die Schaltfläche "Start" klicken. Es wird eine MediaPipeline erstellt, über die der Medienverkehr übertragen wird. Die Medienelemente WebRtcEndpoint und FaceOverlayFilter werden erstellt und eine Verbindung zwischen ihnen hergestellt.

Hier ist eine vereinfachte Folge von Anweisungen, die eine Kette von Programmblöcken für eine bestimmte Anwendung bilden.

 MediaPipeline pipeline = kurento.createMediaPipeline(); WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build(); FaceOverlayFilter faceOverlayFilter = new FaceOverlayFilter.Builder(pipeline).build(); webRtcEndpoint.connect(faceOverlayFilter); faceOverlayFilter.connect(webRtcEndpoint); 

Betrachten Sie die folgende Anwendung aus dem Kurento-Tutorial mit dem Namen RTP-Empfänger.

Wenn nicht gestartet, starten Sie Kurento Media Server

 sudo service kurento-media-server start 

Wenn Sie das Kurento Java-Tutorial bereits geklont haben, führen Sie den folgenden Befehl nicht aus:

 git clone https://github.com/Kurento/kurento-tutorial-java.git 

Gehen Sie zum Projektverzeichnis

 cd kurento-tutorial-java/kurento-rtp-receiver 

Wir stellen das Projekt vom Maven-Team zusammen

 mvn compile exec:java 

oder, wie in meinem Fall, beginnen wir mit der Idee.

Gehen Sie im Firefox-Browser zu https: // localhost: 8443 /

Klicken Sie im folgenden Fenster auf die Schaltfläche "Start"

Bild

Im KMS-Verbindungsinfofenster werden Daten zum Konfigurieren des Befehls für Gstreamer angezeigt: Audio, Videoanschluss, IP-Adresse. Diese Daten sowie der Pfad zur Datei müssen im Befehl angegeben werden.

 PEER_A={KMS_AUDIO_PORT} PEER_V={KMS_VIDEO_PORT} PEER_IP={KMS_PUBLIC_IP} \ SELF_PATH="{PATH_TO_VIDEO_FILE}" \ SELF_A=5006 SELF_ASSRC=445566 \ SELF_V=5004 SELF_VSSRC=112233 \ bash -c 'gst-launch-1.0 -e \ rtpbin name=r sdes="application/x-rtp-source-sdes,cname=(string)\"user\@example.com\"" \ filesrc location="$SELF_PATH" ! decodebin name=d \ d. ! queue ! audioconvert ! opusenc \ ! rtpopuspay ! "application/x-rtp,payload=(int)96,clock-rate=(int)48000,ssrc=(uint)$SELF_ASSRC" \ ! r.send_rtp_sink_0 \ d. ! queue ! videoconvert ! x264enc tune=zerolatency \ ! rtph264pay ! "application/x-rtp,payload=(int)103,clock-rate=(int)90000,ssrc=(uint)$SELF_VSSRC" \ ! r.send_rtp_sink_1 \ r.send_rtp_src_0 ! udpsink host=$PEER_IP port=$PEER_A bind-port=$SELF_A \ r.send_rtcp_src_0 ! udpsink host=$PEER_IP port=$((PEER_A+1)) bind-port=$((SELF_A+1)) sync=false async=false \ udpsrc port=$((SELF_A+1)) ! r.recv_rtcp_sink_0 \ r.send_rtp_src_1 ! udpsink host=$PEER_IP port=$PEER_V bind-port=$SELF_V \ r.send_rtcp_src_1 ! udpsink host=$PEER_IP port=$((PEER_V+1)) bind-port=$((SELF_V+1)) sync=false async=false \ udpsrc port=$((SELF_V+1)) ! tee name=t \ t. ! queue ! r.recv_rtcp_sink_1 \ t. ! queue ! fakesink dump=true async=false' 

Überprüfen Sie übrigens, ob Sie Gstreamer installiert haben

 gst-launch-1.0 —gst-version 

In der Konsole haben sie den Befehl Gstreamer-a gestartet.

Jetzt spielt die Aufmerksamkeit im Lotto. Ich weiß nicht, ob Ihre Datei abgespielt wird oder nicht. Aus meiner eher schlechten Sammlung von Clips wurden Dateien mit der Erweiterung * .mpg abgespielt

Bild

Hier wird der Clip von Natalia Mogilevskaya abgespielt. Clips mit einer anderen Erweiterung werden entweder nicht oder mit verzerrtem Sound abgespielt.

Aus dieser Erfahrung schließen wir: Nicht alle Joghurts sind gleich nützlich.

Wir werden den Betrieb dieser Anwendung analysieren. Zunächst wird eine Medienpipeline zur Übertragung des Medienverkehrs sowie von RtpEndpoint und WebRtcEndpoint erstellt. Letztere führt die Arbeit des Empfängers von RTP-Paketen aus und dient zur Anzeige eines Videoclips.

Hier ist eine vereinfachte Folge von Anweisungen für diesen Teil der Java-Anwendung:

 final MediaPipeline pipeline = kurento.createMediaPipeline(); final RtpEndpoint rtpEp = makeRtpEndpoint(pipeline, useSrtp); final WebRtcEndpoint webRtcEp = new WebRtcEndpoint.Builder(pipeline).build(); rtpEp.connect(webRtcEp); 

Damit ist die Überprüfung dieses Teils des Kurento-Tutorials abgeschlossen. Hab eine schöne Programmierung!

Kurento
Kurento-Tutorial
Vorheriger Artikel

Source: https://habr.com/ru/post/de435922/


All Articles