使用GStreamer发送和接收自定义RTCP数据包/事件

时间:2020-07-15 15:36:14

标签: c++ gstreamer rtp gstreamer-1.0 rtcp

我正在寻求构建一种MCPTT(一键通)类型的应用程序,通过发送RTCP数据包来处理发言权控制

在MCPTT楼层类型的上下文中,RTCP数据包的定义如https://www.wireshark.org/docs/dfref/r/rtcp.html(搜索关键字“ floor”)

我正在使用GStreamer媒体库进行音频视频流传输。例如,如果我有如下所示的管道,

发件人1:

videotestsrc ! vp8enc ! rtphvp8pay name=pay1 ! udpsink host=X port=5001

发件人2:

videotestsrc ! vp8enc ! rtphvp8pay name=pay2 ! udpsink host=X port=5002

接收器:

udpsrc port=5001 ! rtpvp8depay name=depay1 !
                                             input-selector name=select1 ! rtpvp8pay ! udpsink
udpsrc port=5002 ! rtpvp8depay name=depay2 !

我实际上将上面用C代码编写,上面仅用于管道表示

在上述情况下,基于从 pay1 / pay2 发送并在 depay1 / depay2 接收的RTCP限制事件,我将控制活动输入选择器的接收器

我想知道如何在GStreamer中创建自定义RTCP事件并发送它们,并在接收者端接收/解析它们

也请在这里建议这种方法是否适用于这种用例或其他任何方法/库

1 个答案:

答案 0 :(得分:0)

要处理RTCP,您需要在管道中包含rtpbin元素。否则,您只会传输RTP。

在接收方,您需要:

1。从RtpBin获取RTPSession对象

g_signal_emit_by_name (rtpbin, "get-internal-session", id, &session);

2。附加到“ on-receiving-rtcp”信号(或更专业的信号):

g_signal_connect_after (session, "on-receiving-rtcp",
    G_CALLBACK (on_rtcp_callback), my_callback_data);

3。查找所需的RTCP消息

gst_rtcp_buffer_map (buffer, GST_MAP_READ, &rtcp_buffer));
new_packet = gst_rtcp_buffer_get_first_packet (&rtcp_buffer, &rtcp_packet);

while (gst_rtcp_packet_move_to_next (&rtcp_packet) {
  type = gst_rtcp_packet_get_type (&rtcp_packet);
  switch (type) {
  ...
  }
}

4。然后做出相应的反应,即:切换输入选择器。

要发送,在RTPSession上有一个“ on-sending-rtcp”,它将允许您附加自己的RTCP数据包。我不记得是否有更直接的方法。