EOS на конвейере не выполняется - PullRequest
0 голосов
/ 17 октября 2019

Я новичок в GStreamer и пытаюсь создать простой пример, где я получаю видео с веб-камеры и сохраняю его с помощью файловой системы. Я добавил часы на шину, чтобы получить событие EOS, но оно никогда не будет выполнено. Может кто-нибудь сказать мне, что я делаю не так, и как я могу остановить конвейер и заставить работать EOS Event?

import gi import time

gi.require_version ('Gst', '1.0')gi.require_version ('Gtk', '3.0')

из gi.repository import GObject, Gst, Gtk import signal

Gst.init (None)

класс Main: def init (self): signal.signal (signal.SIGINT, self.keyboardInterruptHandler)

    self._pipeline = Gst.parse_launch("avfvideosrc name=avfvideosrc ! x264enc ! queue ! mp4mux ! filesink name=filesink location=output.mp4")
    bus = self._pipeline.get_bus()
    bus.add_signal_watch()
    bus.connect("message::eos", self._on_eos_from_sink_pipeline)
    self._pipeline.set_state(Gst.State.PLAYING)

def _on_eos_from_sink_pipeline(self, _bus, _message):
    print("Got EOS from sink pipeline")

def keyboardInterruptHandler(self,signal, frame):
    print("KeyboardInterrupt (ID: {}) has been caught. Cleaning up...".format(signal))
    self.stopFetching()
    time.sleep(5)
    exit()

def stopFetching(self):
    print("AT THE START OF STOP FETCHING")
    self._pipeline.set_state(Gst.State.NULL)
    self._pipeline.send_event(Gst.Event.new_eos())
    print("AT THE END OF STOP FETCHING")

start = Main () Gtk.main ()

1 Ответ

0 голосов
/ 17 октября 2019

Отвечая на мой собственный вопрос. решение состоит в том, чтобы отправить событие EOS только элементу src, а не каждому элементу в конвейере или в конвейер

...