如何使用webrtcbin创建报价,只接收视频
How to use webrtcbin create offer,only receive video
gstreamer webrtc 演示有效 fine.but 所有演示都有一个小问题:创建报价的所有 webrtcbin 必须有一些 video/audio 数据要发送。
我想使用 webrtcbin 创建报价,并且只接收来自其他 webrtc 对等方的视频数据。
所有demo pipeline都是从videotestsrc/audiotestsrc开始制作测试数据,以便webrtcbin可以将数据发送到远程peer。
但我不想向远程发送任何数据,我必须创建报价,而不是等待报价然后回答。
我正在尝试这个管道:
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 应该是 called.in 我的程序,这个回调从未调用过。
所以,我的问题 is:if webrtcbin 没有媒体源,我怎样才能让 webrtcbin 创建正确的提议,告诉远程节点将媒体发送到本地节点?
我最近尝试在 python 中尝试同样的事情,但在 c 中应该是一样的。我也遇到了这个问题,在我向 webrtcbin 元素添加收发器之前,我没有收集到 ice candidates。
我认为当您添加源时,它会使用源提供的信息自动添加收发器,但是当您将其用作仅接收时,它并不知道它会接收到什么,所以您需要指定它。这就是我在 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 candidates。
gstreamer webrtc 演示有效 fine.but 所有演示都有一个小问题:创建报价的所有 webrtcbin 必须有一些 video/audio 数据要发送。 我想使用 webrtcbin 创建报价,并且只接收来自其他 webrtc 对等方的视频数据。
所有demo pipeline都是从videotestsrc/audiotestsrc开始制作测试数据,以便webrtcbin可以将数据发送到远程peer。 但我不想向远程发送任何数据,我必须创建报价,而不是等待报价然后回答。
我正在尝试这个管道:
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 应该是 called.in 我的程序,这个回调从未调用过。
所以,我的问题 is:if webrtcbin 没有媒体源,我怎样才能让 webrtcbin 创建正确的提议,告诉远程节点将媒体发送到本地节点?
我最近尝试在 python 中尝试同样的事情,但在 c 中应该是一样的。我也遇到了这个问题,在我向 webrtcbin 元素添加收发器之前,我没有收集到 ice candidates。
我认为当您添加源时,它会使用源提供的信息自动添加收发器,但是当您将其用作仅接收时,它并不知道它会接收到什么,所以您需要指定它。这就是我在 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 candidates。