Gstreamer
為什麼來自 Gstreamer 的 rtpbin 範例不起作用?
我正在嘗試執行帶有 GStream 1.18.5的 Ubuntu 21.10 VirtualBox VM 的 rtpbin 範例。
- 我設置了 GStreamer 並且已經能夠執行許多基本和播放教程。
- 我還閱讀了Application Developer Manual的大部分內容。
從 C 程式碼做所有事情似乎很簡單,但
rtpbin
範例使用gst-launch-1.0
(在基本教程之一中介紹)。我最初無法讓
rtpbin
範例執行而沒有錯誤:
ffenc_h263
和ffdec_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
確保所有埠都正常工作
- 我從 snap
rtsp-test-server
和 VLC安裝- 我能夠通過
rtsp-test-server
. 我想這不是一個完美的測試,因為使用的是 TCP 埠而不是 UDP,但它很容易測試,所以我試了一下。但我沒有看到任何影片或聽到任何聲音。有人可以指出我的錯誤嗎?
我幾乎準備好送出我的問題,我又做了一次網際網路搜尋。我發現本教程顯示了添加到
udpsrc
andudpsink
元素的幾個額外標誌。添加以下標誌使範例正常工作,以便我可以通過 RTSP 看到影片和聽到聲音:
host=127.0.0.1
在所有udpsink
元素上address=127.0.0.1
在所有udpsource
元素上我認為我離開的那個教程中的其他標誌可能是預設值。