using element by element mode can‘t work the webrtc
Hi,every one . Thanks for your work I using gst-launch mode(Gst.parse_launch) code can be work, but i using element by element mode(Gst.ElementFactory.make) the code can't work, i want to get offer,but it(on_offer_created) can't generate.
this is code
import sys
sys.path.append("../")
import gi
gi.require_version("Gst", "1.0")
from gi.repository import GObject, Gst
from gi.repository import GLib
class WebRTCClient:
def __init__(self):
self.webrtcbin = None
self.rtspsrc = None
self.parse = None
self.rtph264pay = None
self.caps = None
self.pipeline = None
self.loop = None
self.fake = None
def on_offer_created(self, promise, _, __):
promise.wait()
reply = promise.get_reply()
print(type(reply))
offer = reply.get_value('offer')
print(type(offer))
promise = Gst.Promise.new()
self.webrtcbin.emit('set-local-description', offer, promise)
promise.interrupt()
print(type(offer))
print(offer.sdp.as_text())
def on_negotiation_needed(self, element):
promise = Gst.Promise.new_with_change_func(self.on_offer_created, element, None)
element.emit('create-offer', None, promise)
def send_ice_candidate_message(self, _, mlineindex, candidate):
icemsg = json.dumps({'ice': {'candidate': candidate, 'sdpMLineIndex': mlineindex}})
print('Send ice:\n%s'%(icemsg))
def on_incoming_stream(self, _, pad):
if pad.direction != Gst.PadDirection.SRC:
print("Direction ! = SRC \n"*10)
return
caps=pad.get_current_caps()
structure = caps.get_structure(0)
print(structure.get_name())
fakesink = Gst.ElementFactory.make('fakesink')
self.pipeline.add(fakesink)
fakesink.sync_state_with_parent()
self.webrtcbin.link(fakesink)
def send_ice_candidate_message(self, _, mlineindex, candidate):
icemsg = json.dumps({'ice': {'candidate': candidate, 'sdpMLineIndex': mlineindex}})
def build(self):
rtspsrc -> parsebin -> rtph264pay -> caps -> webrtcbin -> fakesink
self.rtspsrc = Gst.ElementFactory.make("rtspsrc","rtsp")
self.rtspsrc.set_property("location","rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov")
self.parse = Gst.ElementFactory.make("parsebin","pars")
self.rtph264pay = Gst.ElementFactory.make("rtph264pay","rtph264")
self.caps = Gst.ElementFactory.make("capsfilter","caps")
self.caps.set_property("caps", Gst.Caps.from_string("application/x-rtp,media=video,encoding-name=H264,payload=96"))
self.pipeline = Gst.Pipeline()
self.webrtcbin = Gst.ElementFactory.make("webrtcbin","webrtc")
self.webrtcbin.connect('on-negotiation-needed', self.on_negotiation_needed)
self.webrtcbin.connect('on-ice-candidate', self.send_ice_candidate_message)
self.webrtcbin.connect('pad-added', self.on_incoming_stream)
self.pipeline.add(self.rtspsrc)
self.pipeline.add(self.parse)
self.pipeline.add(self.rtph264pay)
self.pipeline.add(self.caps)
self.pipeline.add(self.webrtcbin)
self.rtspsrc.link(self.parse)
self.parse.link(self.rtph264pay)
self.rtph264pay.link(self.caps)
self.caps.link(self.webrtcbin)
self.loop = GObject.MainLoop()
self.pipeline.set_state(Gst.State.PLAYING)
self.loop.run()
Gst.init(None)
GObject.threads_init()
web = WebRTCClient()
web.build()
logs
0:00:05.470299336 25997 0x7fe3fc031450 FIXME default gstutils.c:3981:gst_pad_create_stream_id_internal:fakesrc0:src Creating random stream-id, consider implementing a deterministic way of creating a stream-id 0:00:05.470338427 25997 0x7fe3fc030f70 FIXME default gstutils.c:3981:gst_pad_create_stream_id_internal:fakesrc1:src Creating random stream-id, consider implementing a deterministic way of creating a stream-id 0:00:05.804444889 25997 0x7fe3fc030c50 WARN basesrc gstbasesrc.c:3055:gst_base_src_loop: error: Internal data stream error. 0:00:05.804509269 25997 0x7fe3fc030c50 WARN basesrc gstbasesrc.c:3055:gst_base_src_loop: error: streaming stopped, reason not-linked (-1) 0:00:06.004596168 25997 0x7fe3fc030ca0 WARN basesrc gstbasesrc.c:3055:gst_base_src_loop: error: Internal data stream error. 0:00:06.004639662 25997 0x7fe3fc030ca0 WARN basesrc gstbasesrc.c:3055:gst_base_src_loop: error: streaming stopped, reason not-linked (-1) 0:00:31.400609521 25997 0x7fe3fc030d90 WARN rtspsrc gstrtspsrc.c:3155:on_timeout: source 52508b08, stream 52508b08 in session 1 timed out 0:00:33.716604781 25997 0x7fe3fc030cf0 WARN rtspsrc gstrtspsrc.c:3155:on_timeout: source 68b8dd80, stream 68b8dd80 in session 0 timed out
Looking forward to your reply