Loop a file using playbin without artefacts

Arnaud Loonstra arnaud at sphaero.org
Thu May 21 11:41:46 PDT 2015


Found a bug while doing so:

   File "zvideoplayer.py", line 131, in stop_vid
     Gst.SeekType.END, 0, Gst.SeekType.NONE, Gst.CLOCK_TIME_NONE)
OverflowError: int too big to convert

Anyway your approach didn't help either..

At play I do:

self.playbin.set_state(Gst.State.PLAYING)
self.playbin.get_state(Gst.CLOCK_TIME_NONE)
self.playbin.seek(1.0, Gst.Format.TIME, Gst.SeekFlags.FLUSH | 
Gst.SeekFlags.SEGMENT,\
      Gst.SeekType.END, 0, Gst.SeekType.NONE, 2147483647)

then at SEGMENT_DONE:

flags = Gst.SeekFlags.SEGMENT
self.playbin.seek_simple(Gst.Format.TIME, flags, 0)

The video freezes at the end and unlimited SEGMENT_DONE messages are 
spawned.
A flush makes it loop again but with the artefacts.

I found this in the debug log btw:
0:03:10.029841145 10795 0x7fa4440660a0 ERROR                  libav 
:0:: Invalid level prefix
0:03:10.029951469 10795 0x7fa4440660a0 ERROR                  libav 
:0:: error while decoding MB 101 9

Happens exactly at the artefact moment.

Video is here:
https://github.com/raspberrypi/firmware/blob/master/opt/vc/src/hello_pi/hello_video/test.h264

I've tested this on a desktop computer and a raspberry pi. Both show 
artefacts.

Arnaud


On 2015-05-21 19:54, Nikos Chantziaras wrote:
> I tried many approaches, and the way I ended up with that works very
> reliably is to first put the pipeline into the playing state first,
> wait for the transition to complete, and then do a seek to the end:
>
>   gst_element_set_state(pipeline, GST_STATE_PLAYING);
>   // Wait for the state change to complete.
>   gst_element_get_state(pipeline, 0, 0, GST_CLOCK_TIME_NONE);
>   // Seek to the end.
>   gst_element_seek(pipeline, 1.0, GST_FORMAT_TIME,
>                    GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT,
>                    GST_SEEK_TYPE_END, 0, GST_SEEK_TYPE_NONE,
>                    GST_CLOCK_TIME_NONE);
>
> The above is in my play() routine. In the event handler for
> GST_MESSAGE_SEGMENT_DONE, I simply do:
>
>   gst_element_seek_simple(pipeline, GST_FORMAT_TIME,
>                           GST_SEEK_FLAG_SEGMENT, 0);
>
> This works extremely well for all videos (except for segmented MP4
> files intended for online streaming; a known GStreamer limitation.)
>
> Are you really sure the artifacts you're seeing aren't actually part
> of the video? Can you post the video somewhere to see if it's
> reproducible by others? Also, have you tried other videos? Do you get
> the problem with other videos as well?
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel



More information about the gstreamer-devel mailing list