如何用GStreamer webrtcbin创建仅接收视频的Offer?
解决GStreamer WebRTC创建仅接收Offer的问题
你遇到的核心问题是:当webrtcbin没有本地媒体源时,它默认不会在SDP中包含任何媒体描述——因为它不知道你需要接收什么类型的流。要生成能要求远端发送视频的Offer,关键是手动告诉webrtcbin我们需要仅接收视频流,具体步骤如下:
1. 在协商前添加仅接收的媒体Transceiver
在on-negotiation-needed回调中,先调用webrtcbin的add-transceiver方法,显式添加一个视频收发器,并将其方向设置为RECVONLY(仅接收)。这会让webrtcbin知道要在SDP中包含视频媒体描述,即使没有本地源。
修改你的on-negotiation-needed函数如下:
static void on_negotiation_needed(GstElement *webrtc, gpointer user_data) { // 添加仅接收的视频收发器 GstWebRTCRTPTransceiverDirection recv_only_dir = GST_WEBRTC_RTP_TRANSCEIVER_DIRECTION_RECVONLY; g_signal_emit_by_name(webrtc, "add-transceiver", "video", recv_only_dir, NULL); // 创建Offer并设置回调 GstWebRTCOfferAnswerOptions *options = gst_web_rtc_offer_answer_options_new(); GstPromise *promise = gst_promise_new_with_change_func(on_offer_created, user_data, NULL); g_signal_emit_by_name(webrtc, "create-offer", options, promise); // 释放资源 g_object_unref(options); }
2. 验证生成的SDP
添加transceiver后,生成的Offer SDP应该会包含视频媒体部分,类似这样:
v=0
o=- 12345 0 IN IP4 0.0.0.0
s=-
t=0 0
a=ice-options:trickle
m=video 9 UDP/TLS/RTP/SAVPF 96
...(后续的视频编码、ICE、DTLS等信息)
同时,on-ice-candidate回调也会正常触发,因为现在有需要协商的媒体流了。
关键原理说明
webrtcbin默认是根据已连接的本地pad自动生成媒体描述的——如果你没有连接本地视频/音频源,它就认为不需要处理任何媒体,所以生成的SDP是空的。通过手动添加RECVONLY方向的transceiver,我们强制webrtcbin在SDP中声明"我们只接收视频流",这样远端对等方就知道需要向你发送视频了。
额外注意事项
- 不需要为webrtcbin连接任何本地媒体源(比如videotestsrc),因为我们明确设置了仅接收方向;
- 确保你的
on_incoming_stream回调能正确处理远端传来的视频pad,比如绑定到解码和显示管线; - stun-server配置要正常,否则ICE候选可能无法正常交换,但这是后续连接的问题,先解决SDP媒体描述的问题即可。
内容的提问来源于stack exchange,提问作者宝蓝娃娃
相关产品推荐
相关产品推荐

