Gstreamer RTP传输视频+文字

Posted

技术标签:

【中文标题】Gstreamer RTP传输视频+文字【英文标题】:Gstreamer RTP transmission of video + text 【发布时间】:2020-03-05 20:32:40 【问题描述】:

我正在使用命令行语法编写一个 gstreamer 管道来发送视频流,并想用它发送数据。我认为可行的一种解决方案是将数据作为字幕文件发送。

我可以使用以下管道通过 rtp 复用视频和字幕文件:

gst-launch-1.0 rtpmux name=mux ! udpsink host=127.0.0.1 port=5000 \ 
filesrc location=movie.avi ! decodebin ! videoconvert ! x264enc ! rtph264pay ! mux.sink_0 \
filesrc location=movie.srt ! subparse ! rtpgstpay ! mux.sink_1

我知道它应该到达,因为我可以使用 netcat 查看接收数据的端口。但是当我尝试在接收端使用 gstreamer 读取流时,我得到“语法错误”。我现在使用的管道是

gst-launch-1.0 udpsrc port=5000 caps = "application/x-rtp" ! rtpptdemux name=demux ! queue ! \
demux.src_0 ! rtph264depay ! decodebin ! videoconvert ! autovideosink \
demux.src_1 ! rtpgstdepay ! fakesink

在其中,我尝试撤消在发送方采取的每一步,但有些东西是关闭的,我不知道它是什么。 (稍后我会对字幕做一些事情,fakesink 只是用于调试)

如果有其他方法可以做到这一点,我将非常感谢任何帮助!

关于其他可能的解决方案,我知道 RTP 支持使用 rtp 有效负载 (RFC 4103) 和定时文本 (RFC 4396) 的文本对话,但从我在 gstreamer plugins list for RTP 中找到的内容,有目前还不支持。

我的最终目标是在一台计算机上从 opencv 发送视频以及一些数据,并在接收端同步读取。命令行工作后我会将其适配到opencv并不断重写字幕文件或直接传递变量。

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

命令行语法不正确,因为queue 不能出现在demux 元素之后(尽管在命令行中看起来有点合乎逻辑)。

在您的情况下,queue 元素可以在 demux 源垫之后使用。例如

gst-launch-1.0 udpsrc port=5000 caps = "application/x-rtp" ! rtpptdemux name=demux \
demux.src_0 ! queue ! rtph264depay ! decodebin ! videoconvert ! autovideosink \
demux.src_1 ! queue ! rtpgstdepay ! fakesink

【讨论】:

谢谢! I它解决了语法问题,但出现了其他错误:/GstPipeline:pipeline0/GstUDPSrc:udpsrc0:内部数据流错误。有趣的是,如果没有 demux,视频解码就可以正常工作。 @OnixCB 尝试仅删除 demux.src_1 分支并重新运行命令。还可以尝试将 gstreamer 调试级别设置为更高的值,以查看数据流错误的实际原因。 我试过了,但没有成功。良好的调试信息只出现在第 4 级。显然,无法创建 demux.src_0。它说“元素解复用器中没有这样的 pad src_0”。但它在另一行中说“demux add pad ''src_96”。可能这意味着数据包的有效负载大小,不太确定。在管道中切换 demux.src_96 的 demux 名称不起作用,说它是“内部数据流错误”。进一步的信息说“流不包含足够的数据”

以上是关于Gstreamer RTP传输视频+文字的主要内容,如果未能解决你的问题,请参考以下文章

Raspberry Pi 上的 GStreamer 全高清视频 RTP 流

通过 gstreamer udpsink 流式传输 h.264 时如何解决图像问题

gstreamer让playbin能够播放rtp over udp流数据

处理 chrome 的 rtp 流需要哪些 gstreamer 管道设置?

从图像创建实时 RTP 流

实现RTP协议的H.264视频传输系统