我正在寻求构建一种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事件并发送它们,并在接收者端接收/解析它们
也请在这里建议这种方法是否适用于这种用例或其他任何方法/库
答案 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数据包。我不记得是否有更直接的方法。