Java、Spring、Kurento、およびメディアサービス。 パート2



前の記事で 、KurentoチュートリアルのHelloWorldアプリケーションを使用した実験について説明しました。 この記事では、Java SpringおよびKurento Media Server-aのWebアプリケーションを引き続き確認します。



チュートリアルの次のアプリケーションは、WebRTC Magic Mirrorと呼ばれます。 名前から、鏡はわずかに装飾された現実を反映していることがわかります。 このアプリケーションでは、前のものに加えて、コンピュータービジョンフィルターFaceOverlayフィルターが使用されます。 カメラで人間の顔が検出されると、Kurento Media Serverはスーパーマリオのキャップを頭に「置き」ます。 レンズに複数の顔がある場合、全員が帽子をかぶっています。



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-magic-mirror
      
      





Mavenチームがプロジェクトをコンパイルします



 mvn compile exec:java
      
      





または、私の場合のように、アイデアから始めましょう。



Firefoxブラウザーでhttps:// localhost:8443 /に移動します



開いたウィンドウで「開始」ボタンをクリックすると、画像が表示されます:



画像

この経験から、私たちの結論は次のとおりです。私の猫の顔はまったく人間に見えないので、スーパーマリオの帽子は彼にふさわしくありません。



この例の仕組みを見てみましょう。



アプリケーション構造は、以前のHelloWorldアプリケーションを繰り返します。 3つのアプリケーションブロックは、アプリケーション内で相互作用します。ブラウザ側の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);
      
      





RTP Receiverと呼ばれるKurentoチュートリアルの次のアプリケーションを検討してください。



開始されていない場合は、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:// localhost: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チュートリアル

前の記事



All Articles