Как отсечь кадры поступившие в pipeline до RTSP вызова PLAY?
Являюсь новичком в Gstreamer. Написал простой RTSP сервер который формирует pipeline вида:
appsrc name=vsrc is-live=true do-timestamp=true ! queue ! h264parse ! rtph264pay name=pay0 pt=96
SDP ответ формируется после запроса DESCRIBE, но только после того, как на вход appsrc поступит несколько кадров по сигналу:
vsrc = gst_bin_get_by_name_recurse_up(GST_BIN(element), "vsrc"); // appsrc
if (nullptr != vsrc)
{
gst_util_set_object_arg(G_OBJECT(vsrc), "format", "time");
g_signal_connect(vsrc, "need-data", (GCallback)need_video_data, streamResource);
}
Время с которого нужно воспроизводить видео передается в RTSP запросе PLAY, в заголовке Range как абсолютное:
PLAY rtsp://172.19.9.65:554/Recording/ RTSP/1.0
CSeq: 4
Immediate: yes
Range: clock=20220127T082831.039Z- // начать воспроизведение с ...
К объекту GstRTSPClient привязал обработчик к сигналу в котором обрабатываю этот запрос и делаю перемещение на нужное время в моем appsrc
g_signal_connect(client, "pre-play-request", (GCallback)pre_play_request, NULL);
Проблема заключается в том, что на этот момент в pipline уже поступили кадры с начального времени моего appsrc и я наблюдаю сначала их, а потом вспроизведение продолжается с указанного в запросе PLAY времени. Подскажите пожалуйста, как можно отсечь эти начальные кадры, поступившие до вызова PLAY.
Я пробовал:
- gst_element_seek - не помогает из-за особенностей реализации appsrc
- flush тоже не помог, пробовал сбросить sink у элемента rtph264pay:
gst_pad_push_event(sinkPad, gst_event_new_flush_start());
GST_PAD_STREAM_LOCK(sinkPad);
// ... seek in appsrc
gst_pad_push_event(sinkPad, gst_event_new_flush_stop(TRUE));
GST_PAD_STREAM_UNLOCK(sinkPad);
gst_object_unref(sinkPad);