seek on filesrc with TS file
Marianna S. Buschle
msb at qtec.com
Wed May 19 09:19:30 UTC 2021
I have generated the following test files:
gst-launch-1.0 videotestsrc is-live=true pattern=ball num-buffers=300 !
video/x-raw,framerate=30/1,format=NV12 ! timeoverlay ! x264enc
key-int-max=30 speed-preset=1 tune=zerolatency ! video/x-h264,profile=high !
mpegtsmux ! filesink location=test.ts -v -e
gst-launch-1.0 videotestsrc is-live=true pattern=ball num-buffers=300 !
video/x-raw,framerate=30/1,format=NV12 ! timeoverlay ! filesink
location=test.raw -v
And then they are played in a python app using parse_launch:
"filesrc name=replay location=test.ts ! queue ! tsparse ! tsdemux !
h264parse ! avdec_h264 ! videoconvert ! ximagesink sync=1 "
"filesrc name=replay location=test.raw ! videoparse format=nv12 width=320
height=240 framerate=30/1 ! videoconvert ! ximagesink sync=1 "
I have however issues when trying to do seek operations in the H264 stream
(with TS container).
Without the `queue` after the filesrc I get:
(gst_ctrl.py:183848): GStreamer-CRITICAL **: 11:08:08.431: pushing on pad
replay:src but it was not activated in push mode
0:00:08.281698886 183848 0x7f21940098c0 WARN basesrc
gstbasesrc.c:3127:gst_base_src_loop:<replay> error: Internal data stream
error.
0:00:08.281735348 183848 0x7f21940098c0 WARN basesrc
gstbasesrc.c:3127:gst_base_src_loop:<replay> error: streaming stopped,
reason error (-5)
With the `queue` I'm able to do a single seek operation with:
self.pipeline.seek(1.0, Gst.Format.TIME,
(Gst.SeekFlags.FLUSH | Gst.SeekFlags.ACCURATE),
Gst.SeekType.SET, 0 , Gst.SeekType.NONE, -1)
But subsequent calls to seek give me:
0:00:10.778992854 183974 0x7f5e1c35d960 WARN tsdemux
tsdemux.c:917:gst_ts_demux_do_seek: Couldn't convert start position to an
offset
0:00:10.779094440 183974 0x7f5e1c35d960 WARN mpegtsbase
mpegtsbase.c:1721:mpegts_base_handle_seek_event: seeking failed error
0:00:10.779115381 183974 0x7f5e1c35d960 WARN tsdemux
tsdemux.c:974:gst_ts_demux_srcpad_event: seeking failed
0:00:10.779150565 183974 0x7f5e1c35d960 WARN tsdemux
tsdemux.c:974:gst_ts_demux_srcpad_event: seeking failed
I have no issues with seeking on the raw stream.
Moreover if I try to STOP (set state to NULL) and then re-START (set state
to PLAYING) the pipeline with the H264 encoded file I get:
0:00:18.206206460 184004 0x7f627800a000 WARN basesrc
gstbasesrc.c:3127:gst_base_src_loop:<replay> error: Internal data stream
error.
0:00:18.206265696 184004 0x7f627800a000 WARN basesrc
gstbasesrc.c:3127:gst_base_src_loop:<replay> error: streaming stopped,
reason not-linked (-1)
0:00:18.206345761 184004 0x7f627800a000 WARN queue
gstqueue.c:990:gst_queue_handle_sink_event:<queue0> error: Internal data
stream error.
0:00:18.206371178 184004 0x7f627800a000 WARN queue
gstqueue.c:990:gst_queue_handle_sink_event:<queue0> error: streaming
stopped, reason not-linked (-1)
This works file for the RAW file
Lastly, if I change the `filesrc` into `multifilesrc` I can perform multiple
seeks in the H264 encoded file.
But It jumps to weird positions in the file instead of going to the start.
I have tried using Gst.SeekFlags.KEY_UNIT instead of Gst.SeekFlags.ACCURATE
and trying seeking in BYTES instead of TIME, but seen no real difference...
--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
More information about the gstreamer-devel
mailing list