为什么 Gstreamer 中的 rtpbin 示例不起作用?

为什么 Gstreamer 中的 rtpbin 示例不起作用?

我正在尝试运行rtpbin 示例带有 GStream 1.18.5 的 Ubuntu 21.10 VirtualBox VM。

从 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,但它很容易测试,所以我试了一下。

但我没有看到任何视频或听到任何声音。有人可以指出我的错误吗?

答案1

我几乎准备好提交我的问题了,我又进行了一次互联网搜索。我发现本教程它显示了添加到udpsrcudpsink元素的几个额外标志。添加以下标志使示例正常运行,以便我可以通过 RTSP 观看视频和听到声音:

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

我认为我在该教程中留下的其他标志可能是默认值。

相关内容