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