gstreamer webrtc演示可以正常工作。但是所有演示都存在一个小问题:创建报价的所有webrtcbin必须具有要发送的一些视频/音频数据。
我想使用webrtcbin创建报价,并且仅从其他webrtc对等方接收视频数据。

所有演示管道均从videotestsrc/audiotestsrc开始以生成测试数据,以便webrtcbin可以将数据发送到远程对等方。
但是我不想将任何数据发送到远程,并且我必须创建要约,而不要等要约然后回答。

我正在尝试以下管道:

pipeline = gst_parse_launch(
        "webrtcbin name=recv stun-server=stun://localhost:19302  "
        " ! rtpvp8depay ! vp8dec ! videoconvert ! queue ! fakevideosink ",
        &error);

然后连接信号:

g_signal_connect(webrtc, "on-negotiation-needed", G_CALLBACK(on_negotiation_needed), NULL);
g_signal_connect(webrtc, "on-ice-candidate", G_CALLBACK(send_ice_candidate_message), NULL);

g_signal_connect(webrtc, "pad-added", G_CALLBACK(on_incoming_stream), pipeline);

当我运行程序时,on_negotiation_needed被执行,并且我调用create-offer:

GstPromise* promise;
promise = gst_promise_new_with_change_func(on_offer_created, user_data, NULL);
g_signal_emit_by_name(webrtc, "create-offer", NULL, promise);

但它会产生非常短的sdp:
{"type":"offer","sdp":"v=0\r\no=- 7210256809476625085 0 IN IP4 0.0.0.0\r\ns=-\r\nt=0 0\r\na=ice-options:trickle\r\n"}

该sdp没有任何媒体信息。

并且在调用create-offer之后,应调用on-ice-candidate回调。在我的程序中,此回调从未调用过。

因此,我的问题是:如果webrtcbin没有媒体源,我如何使webrtcbin创建正确的要约,告诉远程对等方将媒体发送给本地对等方?

最佳答案

我最近试图在python中尝试相同的操作,但在c中应该相同。我还遇到了一个问题,直到我在webrtcbin元素中添加了一个收发器之后,我才聚集冰候选人。

我认为添加源时,它将使用源提供的信息自动添加收发器,但是当您仅将其用作接收时,它并不确切知道它将接收什么,因此您需要指定它。这就是我设法在python中做到的方式:

    direction = GstWebRTC.WebRTCRTPTransceiverDirection.RECVONLY
    caps = Gst.caps_from_string("application/x-rtp,media=video,encoding-name=VP8/9000,payload=96")
    self.webrtc.emit('add-transceiver', direction, caps)

您可能在c中具有等效的功能。我不知道它是否可以解决您的sdp大小问题,因为目前也可能有其他问题要添加到webrtc元素中,但是它至少应该允许您获得ice候选对象。

关于webrtc - 如何使用webrtcbin创建报价,仅接收视频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57430215/

10-11 20:08