You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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,提问作者宝蓝娃娃

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:48:01