Как промыть трубопровод gstreamer

случай
Непрерывное чтение из файла и подача на элемент appsrc. Источник - appsrc

У меня есть конвейер GStreamer в состоянии PLAYING. Теперь хотелось бы, чтобы конвейер очищался / очищался при нажатии кнопки, которая означает, что очередь appsrc должна быть очищена. Воспроизведение должно начинаться с любых буферов, которые теперь добавляются в / или добавляются после очистки.

вопрос
API, которые я использовал, вернули false. Я не могу смывать.

fprintf(stderr, "The flush event start was <%d>",gst_element_send_event(GST_ELEMENT (pipe), gst_event_new_flush_start());    
fprintf(stderr, "The flush event stop was  <%d>",gst_element_send_event(GST_ELEMENT (pipe), gst_event_new_flush_stop()));

Оба выше вернули 0. Это означает, что ложь. В чем причина этого ложного?

Как я могу попробовать сбросить данные в конвейере с помощью некоторого API? Или есть какой-нибудь другой API для пропуска воспроизведения?

Пытался

  • Отправка gst_event_new_flush_start () а также gst_event_new_flush_stop () к трубопроводу с зазором в несколько миллисекунд и без него
  • gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 0);
  • установка конвейера в NULL и затем в PLAYING снова

Все это не могло работать.

1 ответ

Решение

Это не сработало для меня, потому что я использовал 0.10 v от gstreamer.Если нет ограничений на использование версии 0.10 gstreamerПожалуйста, используйте версию 1.2 gstreamer.

Тем не менее, в версии 0.10 поиск очистки обычно заменяет очистку конвейера.

При использовании 1.2v, два API gst_event_new_flush_start () а также gst_event_new_flush_stop () Работа. В этом случае вы можете использовать флеш напрямую.

В любом случае вы должны быть в состоянии промыть. Создайте внутренний API, в котором вы выполняете поиск сброса, и используйте его в качестве своего API сброса.

В списке рассылки gstreamer-devel есть сообщение о поведении flush в двух версиях.

Другие вопросы по тегам