
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:

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.

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.

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"

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

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!
KurentoTutoriel KurentoArticle précédent