Appsink stops (pauses/freezes) after 2 frames.

Sébastien FENET sebastien.fenet at yahoo.fr
Fri Mar 27 02:26:28 PDT 2015


Hi,
I can't answer you about your freezing problem (sorry). But I can tell you how to combine gst-launch with callbacks:
        self._pipeline = gst.parse_launch('''
                                    appsrc name=appsrc !
                                    audio/x-raw-float, rate=%i, width=64, depth=64, channels=%i, signed=true, endianness=BYTE_ORDER ! 
                                    audioconvert !
                                    autoaudiosink name =as
                                    ''' % (self.sr, self.data.shape[1]))
        appsrc = self._pipeline.get_by_name('appsrc')
        appsrc.connect('need-data', self._send_buf)



 
      De : Hjalmar Turesson <hturesson at gmail.com>
 À : Discussion of the development of and with GStreamer <gstreamer-devel at lists.freedesktop.org> 
 Envoyé le : Jeudi 26 mars 2015 20h29
 Objet : Appsink stops (pauses/freezes) after 2 frames.
   
Hi,

I'm trying to write the buffer timestamps (buf.pts) of a webcam steam to a text file. I use appsink and a little callable function. This works fine when I stream h.264 (apart from non-monotonical timestamps). But, it fails if I stream raw or mpeg. I see no errors or warnings, but the stream freezes/pauses after two frames (i.e. 2 timestamps written to file). When streaming h.264 h264parse is necessary otherwise it too freezes after 2 frames. I tried using videoparse, but this crashes python, and jpegparse does not make any difference. 

Does anyone have advice?

Scripts (unfortunately not gst-launch since I do not know how to combine that with the callback)
- - - - - - - - - - - - - - - - - -

Streaming h.264 (WORKS):

class Webcam_ts_h264: def __init__(self, video_dev='/dev/video0', fps=15): """ """ ts_log_fname = 'ts_test.log'  self.ts_log = open(ts_log_fname, 'w') self.ts_log.write('n_buf, buf.pts\n') self.n_frames = 0 self.pipeline = Gst.Pipeline()  def on_new_sample(appsink): """ Function called from the pipeline by appsink. Writes the timestampes of frame capture to a log file. """ # Get the buffer smp = appsink.emit('pull-sample') buf = smp.get_buffer() self.n_frames += 1 self.ts_log.write('%d,%0.9f\n' %  (self.n_frames, np.float64(1e-9) * buf.pts)) return Gst.FlowReturn.OK
 # Video source: self.v4l2src = Gst.ElementFactory.make('v4l2src', None) self.v4l2src.set_property('device', video_dev) self.v4l2src.set_property('do-timestamp', 'true') # Formats available from C920 camera:  # 'image/jpeg', 'video/x-h264', 'video/x-raw' vid_caps = Gst.Caps.from_string('video/x-h264,' 'width=%d,height=%d,' 'framerate=%d/1' % (640, 480, fps)) self.vid_filter = Gst.ElementFactory.make('capsfilter', None) self.vid_filter.set_property('caps', vid_caps) self.vid_parse = Gst.ElementFactory.make('h264parse', None) self.ts_sink = Gst.ElementFactory.make('appsink', None) # Setting properties of appsink # Tell sink to emit signals self.ts_sink.set_property('emit-signals', True) self.ts_sink.set_property('sync', False) # No sync # Connect appsink to my function (writing timestamps) self.ts_sink.connect('new-sample', on_new_sample)
 # Add elements to the pipeline self.pipeline.add(self.v4l2src) self.pipeline.add(self.vid_filter) self.pipeline.add(self.vid_parse) self.pipeline.add(self.ts_sink)
 # link self.v4l2src.link(self.vid_filter) self.vid_filter.link(self.vid_parse) self.vid_parse.link(self.ts_sink)  def run(self): self.pipeline.set_state(Gst.State.PLAYING)
 def quit(self): self.pipeline.set_state(Gst.State.NULL) self.ts_log.close()
Streaming raw (FAILS):
class Webcam_ts_raw: def __init__(self, video_dev='/dev/video0', fps=15): """ """ ts_log_fname = 'ts_test.log'  self.ts_log = open(ts_log_fname, 'w') self.ts_log.write('n_buf, buf.pts\n') self.n_frames = 0 self.pipeline = Gst.Pipeline()  def on_new_sample(appsink): """ Function called from the pipeline by appsink. Writes the timestampes of frame capture to a log file. """ # Get the buffer smp = appsink.emit('pull-sample') buf = smp.get_buffer() self.n_frames += 1 self.ts_log.write('%d,%0.9f\n' %  (self.n_frames, np.float64(1e-9) * buf.pts)) return Gst.FlowReturn.OK
 # Video source: self.v4l2src = Gst.ElementFactory.make('v4l2src', None) self.v4l2src.set_property('device', video_dev) self.v4l2src.set_property('do-timestamp', 'true') # Formats available from C920 camera:  # 'image/jpeg', 'video/x-h264', 'video/x-raw' vid_caps = Gst.Caps.from_string('video/x-raw,' 'width=%d,height=%d,' 'framerate=%d/1' % (640, 480, fps)) self.vid_filter = Gst.ElementFactory.make('capsfilter', None) self.vid_filter.set_property('caps', vid_caps) #self.vid_parse = Gst.ElementFactory.make('jpegparse', None) self.ts_sink = Gst.ElementFactory.make('appsink', None) # Setting properties of appsink # Tell sink to emit signals self.ts_sink.set_property('emit-signals', True) self.ts_sink.set_property('sync', False) # No sync # Connect appsink to my function (writing timestamps) self.ts_sink.connect('new-sample', on_new_sample)
 # Add elements to the pipeline self.pipeline.add(self.v4l2src) self.pipeline.add(self.vid_filter) #self.pipeline.add(self.vid_parse) self.pipeline.add(self.ts_sink)
 # link self.v4l2src.link(self.vid_filter) self.vid_filter.link(self.ts_sink) #self.vid_filter.link(self.vid_parse) #self.vid_parse.link(self.ts_sink)  def run(self): self.pipeline.set_state(Gst.State.PLAYING)
 def quit(self): self.pipeline.set_state(Gst.State.NULL) self.ts_log.close() 
Best regards,
Hjalmar

_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20150327/b7058584/attachment-0001.html>


More information about the gstreamer-devel mailing list