Использование GStreamer с PyGTK - Как подключить кнопки GPIO, чтобы сигнализировать об изменениях конвейера GStreamer? - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь создать интерфейс, отображающий видеовыход 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? Спасибо

...