我是GStreamer的新手,并尝试创建一个简单的示例,在该示例中,我从网络摄像头获取视频并使用filesink保存它。我在总线上添加了一个手表来获取EOS事件,但是它从未执行过。有人可以告诉我我在这里做错了什么,如何停止管道并使EOS Event运行?
import gi 导入时间
gi.require_version('Gst','1.0') gi.require_version('Gtk','3.0')
从gi.repository导入GObject,Gst,Gtk 导入信号
Gst.init(无)
类主要: def init (自己): 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")
开始= Main() Gtk.main()
答案 0 :(得分:0)
回答我自己的问题。解决方案是仅将EOS事件发送给src元素,而不发送给管道中的每个元素或管道