Gstreamer

為什麼來自 Gstreamer 的 rtpbin 範例不起作用?

  • December 10, 2021

我正在嘗試執行帶有 GStream 1.18.5的 Ubuntu 21.10 VirtualBox VM 的 rtpbin 範例。

從 C 程式碼做所有事情似乎很簡單,但rtpbin範例使用gst-launch-1.0(在基本教程之一中介紹)。

我最初無法讓rtpbin範例執行而沒有錯誤:

  • ffenc_h263ffdec_h263( WARNING: 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 

確保所有埠都正常工作

  • 我從 snaprtsp-test-server和 VLC安裝
  • 我能夠通過rtsp-test-server. 我想這不是一個完美的測試,因為使用的是 TCP 埠而不是 UDP,但它很容易測試,所以我試了一下。

但我沒有看到任何影片或聽到任何聲音。有人可以指出我的錯誤嗎?

我幾乎準備好送出我的問題,我又做了一次網際網路搜尋。我發現本教程顯示了添加到udpsrcandudpsink元素的幾個額外標誌。添加以下標誌使範例正常工作,以便我可以通過 RTSP 看到影片和聽到聲音:

  • host=127.0.0.1在所有udpsink元素上
  • address=127.0.0.1在所有udpsource元素上

我認為我離開的那個教程中的其他標誌可能是預設值。

引用自:https://unix.stackexchange.com/questions/680984