Как отсечь кадры поступившие в 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.

Я пробовал:

  1. gst_element_seek - не помогает из-за особенностей реализации appsrc
  2. 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);


Ответы (0 шт):