Java,Spring,Kurento和媒体服务。 第二部分


上一篇文章中,我描述了Kurento教程中的HelloWorld应用程序的实验。 在本文中,我将继续回顾Java Spring和Kurento Media Server-a中的Web应用程序。

本教程中的下一个应用程序称为WebRTC Magic Mirror。 从名称可以看出,镜子反映了略带点缀的现实。 在此应用程序中,除了前一个应用程序之外,还使用了计算机视觉过滤器FaceOverlay过滤器。 当在相机中检测到人脸时,Kurento媒体服务器将“超级马里奥”帽戴在头上。 如果镜头中有多个面孔,则每个人都戴着帽子。

启动Kurento媒体服务器

sudo service kurento-media-server start 

如果您已经克隆了Kurento Java教程,请不要运行以下命令:

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

转到项目目录

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

我们由Maven团队编译项目

 mvn compile exec:java 

或者,就我而言,让我们从想法开始。

在Firefox浏览器中,转到https://本地主机:8443 /

在打开的窗口中,单击“开始”按钮,您应该看到一张图片:

图片
根据这种经验,我们得出结论:我的猫的面孔根本看起来不像人,因此超级马里奥的帽子不适合他。

让我们看看这个例子是如何工作的。

该应用程序结构重复先前的HelloWorld应用程序。 应用程序中有三个软件模块相互作用:在浏览器端,Java Script代码,在服务器端,用于控制Kurento Media Server的Spring-Boot Web应用程序。 这些程序块基于Json协议彼此交换消息。

图片

该图显示,在KMS中,WebRtcEndpoint程序块不再包装要接收的多媒体信号的传输,而是首先将其传递给FaceOverlayFilter,后者确定图片中是否存在面部。

程序块之间的信号交换与HelloWorld应用程序中的信号交换大致相同。

图片

当您单击“开始”按钮时,将执行应用程序中的主要操作。 创建一个MediaPipeline,通过它可以传输媒体流量,创建WebRtcEndpoint和FaceOverlayFilter媒体元素,并在它们之间建立连接。

这是简化的语句序列,形成了给定应用程序的程序块链。

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

考虑Kurento教程中称为RTP Receiver的以下应用程序。

如果未启动,请启动Kurento Media Server

 sudo service kurento-media-server start 

如果您已经克隆了Kurento Java教程,请不要运行以下命令:

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

转到项目目录

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

我们由Maven团队编译项目

 mvn compile exec:java 

或者,就我而言,我们从创意开始。

在Firefox浏览器中,转到https://本地主机:8443 /

在打开的窗口中,单击“开始”按钮

图片

在KMS连接信息窗口中,将显示用于配置Gstreamer命令的数据:音频,视频端口,IP地址。 必须在命令中指定此数据以及文件的路径。

 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' 

顺便说一句,检查是否已安装Gstreamer

 gst-launch-1.0 —gst-version 

将端口和东西框起来,在控制台中,他们启动了Gstreamer-a命令。

现在,人们开始关注彩票。 我不知道您的文件是否将被播放。 从我相当糟糕的剪辑集中,开始播放带有* .mpg扩展名的文件

图片

在这里播放Natalia Mogilevskaya的剪辑。 具有不同扩展名的剪辑不能播放,或者声音失真。

根据这一经验,我们得出结论:并非所有的酸奶都同样有用。

我们将分析此应用程序的操作。 首先,创建媒体管道以及RtpEndpoint和WebRtcEndpoint来传输媒体流量,后者执行RTP数据包的接收器工作并用于显示视频剪辑。

这是Java应用程序这一部分的简化语句序列:

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

至此,对Kurento教程的这一部分进行了总结。 有一个不错的编程!

库伦托
Kurento教程
上一篇文章

Source: https://habr.com/ru/post/zh-CN435922/


All Articles