Java, Spring, Kurento y servicios de medios. Parte 2


En un artículo anterior, describí mi experimento con la aplicación HelloWorld del tutorial de Kurento. En este artículo, continuaré revisando aplicaciones web en Java Spring y Kurento Media Server-a.

La siguiente aplicación en el tutorial se llama WebRTC Magic Mirror. Del nombre se deduce que el espejo refleja una realidad ligeramente adornada. En esta aplicación, además de la anterior, se utiliza el filtro de visión artificial FaceOverlay. Cuando se detecta un rostro humano en la cámara, el Kurento Media Server "pone" una gorra de Super Mario en su cabeza. Si hay varias caras en la lente, todos llevan una gorra.

Inicie Kurento Media Server

sudo service kurento-media-server start 

Si ya ha clonado el tutorial de Kurento Java, no ejecute el siguiente comando:

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

Ir al directorio del proyecto

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

Recopilamos el proyecto por el equipo de Maven.

 mvn compile exec:java 

O, como en mi caso, comencemos por la Idea.

En el navegador Firefox, vaya a https: // localhost: 8443 /

En la ventana que se abre, haga clic en el botón "Inicio", debería ver una imagen:

imagen
De esta experiencia concluimos: la cara de mi gato no se parece en nada a una cara humana, por lo que la gorra de Super Mario no es apropiada para él.

Veamos cómo funciona este ejemplo.

La estructura de la aplicación repite la aplicación HelloWorld anterior. Tres bloques de aplicaciones interactúan en la aplicación: en el código Java Script del lado del navegador, en el lado del servidor, la aplicación web Spring-Boot que administra el Kurento Media Server. Estos bloques de programas intercambian mensajes entre sí en función del protocolo Json.

imagen

El diagrama muestra que en KMS, el bloque de programa WebRtcEndpoint ya no envuelve la transmisión de la señal multimedia para la recepción, sino que primero la pasa a través del FaceOverlayFilter, que determina la presencia de una cara en la imagen.

El intercambio de señal entre los bloques del programa es aproximadamente el mismo que en la aplicación HelloWorld.

imagen

Las acciones principales en la aplicación se realizan al hacer clic en el botón "Inicio". Se crea una MediaPipeline a través de la cual se transmitirá el tráfico de medios, se crean los elementos de medios WebRtcEndpoint y FaceOverlayFilter, y se crea una conexión entre ellos.

Aquí hay una secuencia simplificada de declaraciones que forma una cadena de bloques de programa para una aplicación dada.

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

Considere la siguiente aplicación del tutorial de Kurento llamada RTP Receiver.

Si no se inició, inicie Kurento Media Server

 sudo service kurento-media-server start 

Si ya ha clonado el tutorial de Kurento Java, no ejecute el siguiente comando:

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

Ir al directorio del proyecto

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

Recopilamos el proyecto por el equipo de Maven.

 mvn compile exec:java 

o, como en mi caso, comencemos por la Idea.

En el navegador Firefox, vaya a https: // localhost: 8443 /

en la ventana que se abre, haga clic en el botón "Inicio"

imagen

En la ventana de información de conexión KMS, aparecen datos para configurar el comando para Gstreamer: audio, puerto de video, dirección IP. Estos datos, así como la ruta al archivo, deben especificarse en el comando.

 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' 

Por cierto, verifique si tiene instalado Gstreamer

 gst-launch-1.0 —gst-version 

Enmarcado los puertos y esas cosas, en la consola lanzaron el comando Gstreamer-a.

Ahora, la atención está jugando a la lotería. No sé si tu archivo se reproducirá o no. De mi colección de clips bastante pobre, los archivos con la extensión * .mpg comenzaron a reproducirse

imagen

Aquí, se reproduce el clip de Natalia Mogilevskaya. Los clips con una extensión diferente no se reproducen o se reproducen con sonido distorsionado.

De esta experiencia concluimos: no todos los yogures son igualmente útiles.

Analizaremos el funcionamiento de esta aplicación. Primero, se crea una canalización de medios para transmitir tráfico de medios, así como RtpEndpoint y WebRtcEndpoint, este último realiza el trabajo del receptor de paquetes RTP y se utiliza para mostrar un videoclip.

Aquí hay una secuencia simplificada de declaraciones para esta parte de la aplicación Java:

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

Esto concluye la revisión de esta parte del tutorial de Kurento. Que tengas una buena programación!

Kurento
Tutorial de Kurento
Artículo anterior

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


All Articles