1

我正在寻找构建一个 MCPTT(一键通)类型的应用程序,其中通过发送 RTCP 数据包来处理楼层控制

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

我正在使用 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 floor 事件,我将控制输入选择器的活动 sink-pad

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

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

4

1 回答 1

3

要处理 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 数据包。我不记得是否有更直接的方法。

于 2020-07-17T22:17:37.337 回答