我正在尝试运行带有 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
元素上我认为我离开的那个教程中的其他标志可能是默认值。