Я пытаюсь создать интерфейс, отображающий видеовыход Raspberry Pi Camera V2 с помощью GStreamer. Я делаю это на Jetson Nano, используя Python 3.6.8 и PyGTK 2.24, показывая вывод GStreamer в окне GTK. Кроме того, я пытаюсь настроить кнопки, подключенные к контактам GPIO Jetson Nano, чтобы вызывать изменения в выходном видео GStreamer, например, переворачивать видео.
Текущий код:
from gi.repository import Gdk
from gi.repository import Gst
from gi.repository import Gtk
from gi.repository import GdkX11 # for window.get_xid()
from gi.repository import GstVideo # for sink.set_window_handle()
from gi.repository import GdkPixbuf # for pixbufs --> overlay image icons
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
def window_closed(widget, event, pipeline):
widget.hide()
pipeline.set_state(Gst.State.NULL)
Gtk.main_quit()
if __name__ == "__main__":
Gdk.init([])
Gtk.init([])
Gst.init([])
# Create the pipeline and the pipeline elements
pipeline = Gst.Pipeline()
src = Gst.ElementFactory.make("nvarguscamerasrc", None)
src.set_property("wbmode", 0)
c1caps = Gst.Caps.from_string("video/x-raw(memory:NVMM),width=1920,height=1080, framerate=30/1,format=NV12")
c1filter = Gst.ElementFactory.make("capsfilter", "filter1")
c1filter.set_property("caps", c1caps)
vconv = Gst.ElementFactory.make('nvvidconv', "vconv")
vconv.set_property("flip-method", 0)
c2caps = Gst.Caps.from_string("video/x-raw,width=1920,height=1080,format=RGBA")
c2filter = Gst.ElementFactory.make("capsfilter", "filter2")
c2filter.set_property("caps", c2caps)
vcrop = Gst.ElementFactory.make('videocrop', "vcrop")
vcrop.set_property("left", 150)
vcrop.set_property("right", 150)
sink = Gst.ElementFactory.make("glimagesink")
# add elements to the pipeline
pipeline.add(src)
pipeline.add(c1filter)
pipeline.add(vconv)
pipeline.add(c2filter)
pipeline.add(vcrop)
pipeline.add(sink)
# link elements in the pipeline
src.link(c1filter)
c1filter.link(vconv)
vconv.link(c2filter)
c2filter.link(vcrop)
vcrop.link(sink)
# create the GTK window
window = Gtk.Window()
window.connect("delete-event", window_closed, pipeline)
window.set_default_size(1920, 1080)
window.set_title("Application")
# Create the drawing area widget
drawing_area = Gtk.DrawingArea()
drawing_area.set_double_buffered(True)
# add the drawing area widget to the window and show it
window.add(drawing_area)
window.show_all()
window.realize()
# link the GStreamer video to the drawing area widget
xid = drawing_area.get_window().get_xid()
sink.set_window_handle(xid)
if pipeline.set_state(Gst.State.PLAYING) == Gst.StateChangeReturn.FAILURE:
pipeline.set_state(Gst.State.NULL)
else:
Gtk.main()
Это - это базовое c краткое изложение того, что я пытаюсь реализовать:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.IN)
# if pin 12 is pressed:
# vconv.set_property("flipmethod", 2)
Как бы я go мог подключать кнопки GPIO для запуска изменений элементов в конвейере GStreamer и отображения этих изменений в окно GTK? Спасибо