Java, Spring, Kurento et services médias. 2e partie


Dans un article précédent, j'ai décrit mon expérience avec l'application HelloWorld du tutoriel Kurento. Dans cet article, je continuerai à passer en revue les applications Web dans Java Spring et Kurento Media Server-a.

L'application suivante du didacticiel s'appelle WebRTC Magic Mirror. Du nom, il s'ensuit que le miroir reflète une réalité légèrement embellie. Dans cette application, en plus de la précédente, le filtre de vision par ordinateur FaceOverlay est utilisé. Lorsqu'un visage humain est détecté dans l'appareil photo, le serveur multimédia Kurento «met» une casquette Super Mario sur sa tête. S'il y a plusieurs visages dans l'objectif, tout le monde porte une casquette.

Lancez Kurento Media Server

sudo service kurento-media-server start 

Si vous avez déjà cloné le didacticiel Java Kurento, n'exécutez pas la commande suivante:

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

Accédez au répertoire du projet

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

Nous compilons le projet par l'équipe Maven

 mvn compile exec:java 

Ou, comme dans mon cas, commençons par l'Idée.

Dans le navigateur Firefox, accédez à https: // localhost: 8443 /

Dans la fenêtre qui s'ouvre, cliquez sur le bouton "Démarrer", vous devriez voir une image:

image
De cette expérience nous concluons: le visage de mon chat ne ressemble pas du tout à un visage humain, donc la casquette de Super Mario ne lui convient pas.

Voyons comment fonctionne cet exemple.

La structure de l'application répète la précédente application HelloWorld. Trois blocs logiciels interagissent dans l'application: côté navigateur, code Java Script, côté serveur Spring-Boot Web application qui contrôle le Kurento Media Server. Ces programmes bloquent les échanges de messages entre eux sur la base du protocole Json.

image

Le diagramme montre que dans KMS, le bloc de programme WebRtcEndpoint n'enveloppe plus la transmission du signal multimédia pour la réception, mais le fait d'abord passer par le FaceOverlayFilter, qui détermine la présence d'un visage dans l'image.

L'échange de signaux entre les blocs de programme est approximativement le même que dans l'application HelloWorld.

image

Les principales actions de l'application sont effectuées lorsque vous cliquez sur le bouton "Démarrer". Un MediaPipeline est créé, à travers lequel le trafic multimédia sera transmis, les éléments multimédias WebRtcEndpoint et FaceOverlayFilter sont créés, une connexion entre eux est créée.

Voici une séquence simplifiée d'instructions qui forme une chaîne de blocs de programme pour une application donnée.

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

Considérez l'application suivante du didacticiel Kurento appelée RTP Receiver.

S'il n'est pas démarré, démarrez Kurento Media Server

 sudo service kurento-media-server start 

Si vous avez déjà cloné le didacticiel Java Kurento, n'exécutez pas la commande suivante:

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

Accédez au répertoire du projet

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

Nous compilons le projet par l'équipe Maven

 mvn compile exec:java 

ou, comme dans mon cas, commençons par l'Idée.

Dans le navigateur Firefox, accédez à https: // localhost: 8443 /

dans la fenêtre qui s'ouvre, cliquez sur le bouton "Démarrer"

image

Dans la fenêtre d'informations de connexion KMS, des données apparaissent pour configurer la commande pour Gstreamer: audio, port vidéo, adresse IP. Ces données, ainsi que le chemin d'accès au fichier, doivent être spécifiés dans la commande.

 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' 

Au fait, vérifiez si Gstreamer est installé

 gst-launch-1.0 —gst-version 

Encadré les ports et les trucs, dans la console, ils ont lancé la commande Gstreamer-a.

Maintenant, l'attention joue à la loterie. Je ne sais pas si votre fichier sera lu ou non. À partir de ma collection plutôt médiocre de clips, les fichiers avec l'extension * .mpg ont commencé à jouer

image

Ici, le clip de Natalia Mogilevskaya est joué. Les clips avec une extension différente ne sont pas lus ou jouent avec un son déformé.

De cette expérience nous concluons: tous les yaourts ne sont pas également utiles.

Nous analyserons le fonctionnement de cette application. Tout d'abord, un Media Pipeline est créé pour transmettre le trafic multimédia, ainsi que RtpEndpoint et WebRtcEndpoint, ce dernier effectue le travail du récepteur des paquets RTP et est utilisé pour afficher un clip vidéo.

Voici une séquence d'instructions simplifiée pour cette partie de l'application Java:

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

Ceci conclut l'examen de cette partie du didacticiel Kurento. Bonne programmation!

Kurento
Tutoriel Kurento
Article précédent

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


All Articles