<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><br><div>OK I got it. I can use signal callback function to get the stream data. like below:</div><div> </div><div>import gi</div><div>gi.require_version('Gst', '1.0')</div><div>gi.require_version('GstApp', '1.0')</div><div>from gi.repository import GObject, Gst, GstApp</div><div><br></div><div>GObject.threads_init()</div><div>Gst.init(None)</div><div><br></div><div><br></div><div>class Example:</div><div> def __init__(self):</div><div> self.mainloop = GObject.MainLoop()</div><div> self.pipeline = Gst.Pipeline()</div><div> self.bus = self.pipeline.get_bus()</div><div> self.bus.add_signal_watch()</div><div> self.bus.connect('message::eos', self.on_eos)</div><div> self.bus.connect('message::error', self.on_error)</div><div><br></div><div> # Create elements</div><div> self.src = Gst.ElementFactory.make('v4l2src', None)</div><div> self.encoder = Gst.ElementFactory.make('x264enc', None)</div><div> self.parse = Gst.ElementFactory.make('h264parse', None)</div><div> self.mux = Gst.ElementFactory.make('flvmux', None)</div><div> self.sink = Gst.ElementFactory.make('appsink', None)</div><div><br></div><div> # Add elements to pipeline</div><div> self.pipeline.add(self.src)</div><div> self.pipeline.add(self.encoder)</div><div> self.pipeline.add(self.parse)</div><div> self.pipeline.add(self.mux)</div><div> self.pipeline.add(self.sink)</div><div><br></div><div> # Set properties</div><div> self.src.set_property('device', "/dev/video0")</div><div> self.sink.set_property('emit-signals', True)</div><div> # turns off sync to make decoding as fast as possible</div><div> self.sink.set_property('sync', False)</div><div> self.sink.connect('new-sample', self.on_new_buffer)</div><div><br></div><div> # Link elements</div><div> self.src.link(self.encoder)</div><div> self.encoder.link(self.parse)</div><div> self.parse.link(self.mux)</div><div> self.mux.link(self.sink)</div><div><br></div><div> def on_new_buffer(self, appsink):</div><div> appsink_sample = GstApp.AppSink.pull_sample(self.sink)</div><div> # with open('example.h264', 'a+') as streamer:</div><div> buff = appsink_sample.get_buffer()</div><div> size, offset, maxsize = buff.get_sizes()</div><div> frame_data = buff.extract_dup(offset, size)</div><div> print(size)</div><div> # flag, info = buff.map(Gst.MapFlags.READ)</div><div> # streamer.write(info.data)</div><div> # print(info.size)</div><div> return False</div><div><br></div><div> def run(self):</div><div> self.pipeline.set_state(Gst.State.PLAYING)</div><div> self.mainloop.run()</div><div><br></div><div> def kill(self):</div><div> self.pipeline.set_state(Gst.State.NULL)</div><div> self.mainloop.quit()</div><div><br></div><div> def on_eos(self, bus, msg):</div><div> print('on_eos()')</div><div> self.kill()</div><div><br></div><div> def on_error(self, bus, msg):</div><div> print('on_error():', msg.parse_error())</div><div> self.kill()</div><div><br></div><div><br></div><div>example = Example()</div><div>example.run()</div><br><br><div style="position:relative;zoom:1"></div><div id="divNeteaseMailCard"></div><br>At 2018-01-12 11:42:50, "black" <wangyawei_dlut@163.com> wrote:<br> <blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial">How I get the continue stream data? Coulud you give me a support?<br><br><br><br><br><div style="position:relative;zoom:1"></div><div></div><br><pre><br>At 2018-01-12 11:10:14, "Matthew Waters" <<a href="mailto:ystreet00@gmail.com">ystreet00@gmail.com</a>> wrote:
>On 12/01/18 12:56, Yawei Wang wrote:
>> I use python to get data from appsink. My code is like below:
>> ```
>> import gi
>> gi.require_version('Gst', '1.0')
>> gi.require_version('GstApp', '1.0')
>> from gi.repository import GObject, Gst, GstApp
>>
>> GObject.threads_init()
>> Gst.init(None)
>>
>>
>> class Example:
>> def __init__(self):
>> self.mainloop = GObject.MainLoop()
>> self.pipeline = Gst.Pipeline()
>> self.bus = self.pipeline.get_bus()
>> self.bus.add_signal_watch()
>> self.bus.connect('message::eos', self.on_eos)
>> self.bus.connect('message::error', self.on_error)
>>
>> # Create elements
>> self.src = Gst.ElementFactory.make('v4l2src', None)
>> self.encoder = Gst.ElementFactory.make('x264enc', None)
>> self.parse = Gst.ElementFactory.make('h264parse', None)
>> self.mux = Gst.ElementFactory.make('flvmux', None)
>> self.sink = Gst.ElementFactory.make('appsink', None)
>>
>> # Add elements to pipeline
>> self.pipeline.add(self.src)
>> self.pipeline.add(self.encoder)
>> self.pipeline.add(self.parse)
>> self.pipeline.add(self.mux)
>> self.pipeline.add(self.sink)
>>
>> # Set properties
>> self.src.set_property('device', "/dev/video0")
>>
>> # Link elements
>> self.src.link(self.encoder)
>> self.encoder.link(self.parse)
>> self.parse.link(self.mux)
>> self.mux.link(self.sink)
>>
>> def run(self):
>> self.pipeline.set_state(Gst.State.PLAYING)
>> # self.mainloop.run()
>> appsink_sample = GstApp.AppSink.pull_sample(self.sink)
>
>This needs to be in the while loop below.
>
>What the code currently says is:
>1. Pull one sample
>2. While true, get the buffer from the sample (this will always return
>the same buffer).
>
>
>What you want is to pull_sample() inside the while loop
>> while True:
>> buff = appsink_sample.get_buffer()
>> size, offset, maxsize = buff.get_sizes()
>> frame_data = buff.extract_dup(offset, size)
>> print(frame_data)
>>
>> def kill(self):
>> self.pipeline.set_state(Gst.State.NULL)
>> self.mainloop.quit()
>>
>> def on_eos(self, bus, msg):
>> print('on_eos()')
>> self.kill()
>>
>> def on_error(self, bus, msg):
>> print('on_error():', msg.parse_error())
>> self.kill()
>>
>>
>> example = Example()
>> example.run()
>> ```
>>
>> But I got the same data like "FLV\0x01\0x01". Someone could answer the
>> question?
>>
>>
>>
>> --
>> Sent from: http://gstreamer-devel.966125.n4.nabble.com/
>> _______________________________________________
>> gstreamer-devel mailing list
>> <a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a>
>> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>
>
</pre></div><br><br><span title="neteasefooter"><p> </p></span></blockquote></div><br><br><span title="neteasefooter"><p> </p></span>