我正在尝试运行rtpbin 示例带有 GStream 1.18.5 的 Ubuntu 21.10 VirtualBox VM。
- 我设置了 GStreamer 并且能够运行许多基本的和回放教程。
- 我也读过很大一部分应用程序开发人员手册。
从 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,但它很容易测试,所以我试了一下。
但我没有看到任何视频或听到任何声音。有人可以指出我的错误吗?
答案1
我几乎准备好提交我的问题了,我又进行了一次互联网搜索。我发现本教程它显示了添加到udpsrc
和udpsink
元素的几个额外标志。添加以下标志使示例正常运行,以便我可以通过 RTSP 观看视频和听到声音:
host=127.0.0.1
在所有udpsink
元素上address=127.0.0.1
在所有udpsource
元素上
我认为我在该教程中留下的其他标志可能是默认值。