Gstreamerのrtpbinの例がうまくいかないのはなぜですか?

Gstreamerのrtpbinの例がうまくいかないのはなぜですか?

走ろうとしています。rtpbinの例GStream 1.18.5を含むUbuntu 21.10 VirtualBox VM。

Cコードですべてを行うのは簡単に見えますが、rtpbingst-launch-1.0では(基本チュートリアルの一つ)。

rtpbin最初は例がうまくいきませんでした。

  • ffenc_h263ffdec_h263WARNING: erroneous pipeline: no element "ffenc_h263")なので、それぞれavenc_h263とで置き換えました。avdec_h263
  • v4l2srcで利用できないデバイスを探していて、に/dev切り替えましたvideotestsrc

これらの代替エントリが問題でないことを確認するために、RTSP および UDP エントリを削除し、次を実行して確認しました。

gst-launch-1.0 videotestsrc ! videoconvert ! avenc_h263 ! rtph263pay \ 
    ! rtph263depay ! avdec_h263 ! xvimagesink

そして「バー」のビデオを見ました。私も逃げた

gst-launch-1.0 audiotestsrc ! amrnbenc ! rtpamrpay ! rtpamrdepay ! amrnbdec ! alsasink

迷惑なテストトーンを聞いてください。これに基づいて、問題はUDPとRTSPにあると考えられています。

走る

 gst-launch-1.0 rtpbin name=rtpbin \
         videotestsrc ! videoconvert ! avenc_h263 ! rtph263pay ! rtpbin.send_rtp_sink_0 \
                   rtpbin.send_rtp_src_0 ! udpsink port=5000                            \
                   rtpbin.send_rtcp_src_0 ! udpsink port=5001 sync=false async=false    \
                   udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0                           \
         audiotestsrc ! amrnbenc ! rtpamrpay ! rtpbin.send_rtp_sink_1                   \
                   rtpbin.send_rtp_src_1 ! udpsink port=5002                            \
                   rtpbin.send_rtcp_src_1 ! udpsink port=5003 sync=false async=false    \
                   udpsrc port=5007 ! rtpbin.recv_rtcp_sink_1

プログラム

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:59.0 / 99:99:99 # This is counting up

その後、別のウィンドウで私は実行します。

gst-launch-1.0 rtpbin name=rtpbin                                          \
     udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1996" \
             port=5000 ! rtpbin.recv_rtp_sink_0                                \
         rtpbin. ! rtph263depay ! avdec_h263 ! xvimagesink                    \
      udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0                               \
      rtpbin.send_rtcp_src_0 ! udpsink port=5005 sync=false async=false        \
     udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1" \
             port=5002 ! rtpbin.recv_rtp_sink_1                                \
         rtpbin. ! rtpamrdepay ! amrnbdec ! alsasink                           \
      udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1                               \
      rtpbin.send_rtcp_src_1 ! udpsink port=5007 sync=false async=false

そして見なさい

Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock

一部のUDPポート(5000、5001、5002、5003、5005、および5007)が開いていると予想しました。もちろん、実行中のnetstatショーは次のとおりです。

rtsp@rtsp-VirtualBox:~$ sudo netstat -apn | grep -w 500[0-9]
udp        0      0 0.0.0.0:5000            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5001            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5002            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5003            0.0.0.0:*                           7076/gst-launch-1.0 
udp        0      0 0.0.0.0:5005            0.0.0.0:*                           6862/gst-launch-1.0 
udp        0      0 0.0.0.0:5007            0.0.0.0:*                           6862/gst-launch-1.0 

すべてのポートが正しく機能していることを確認してください。

  • rtsp-test-serverスナップとVLCからインストールしました。
  • 付属のポートからビデオをストリーミングできますrtsp-test-server。私はUDPの代わりにTCPポートを使用しているので完全なテストではないようですが、テストするのは簡単だったので、試してみました。

しかし、私はどんな映像も見ることができず、どんな音も聞くことができませんでした。誰かが私の間違いを指摘できますか?

答え1

質問を提出する準備がほとんどなって再びインターネット検索をしました。私が見つけたこのチュートリアルudpsrc要素に追加されたいくつかの追加フラグを表示しますudpsink。次のフラグを追加すると、サンプルが機能し、RTSPを介してビデオを表示してサウンドを聞くことができます。

  • host=127.0.0.1すべてのudpsink要素に
  • address=127.0.0.1すべてのudpsource要素に

そのチュートリアルに残された他のフラグはデフォルト値であると思います。

関連情報