Python-Gstreamer для динамического управления свойствами элемента

Я использую Gstreamer 1.0 с привязками Python. Ниже приведен конвейер, который я пытаюсь построить с учетом Opengl плагины :

gltestsrc -> gltransformation -> glimagesink

Я пытаюсь изменить свойства элемента 'gltransformation' динамически на основе значений, полученных от внешнего аппаратного устройства. Вот ссылка для аналогичного вопрос, но это не очень помогло мне в моем случае использования. Ниже приведен фрагмент скрипта Python:

import gi
gi.require_version('Gst','1.0')
from gi.repository import Gst,GstController

#global variables 
#the values of a,b,c get updated for certain events dynamically based on external hardware 
a = 0 
b= 0 
c = 0 


source = Gst.ElementFactory.make("gltestsrc", "source") 
gltrnsfrm = Gst.ElementFactory.make("gltransformation","gltrnsfrm") 
sink = Gst.ElementFactory.make("glimagesink", "sink") 

# create the empty pipeline 
pipeline = Gst.Pipeline.new("test-pipeline") 

if not pipeline or not source or not gltrnsfrm or not sink: 
    print("ERROR: Not all elements could be created") 
    sys.exit(1) 

# build the pipeline 
pipeline.add(source,gltrnsfrm,sink) 

if not source.link(gltrnsfrm): 
    print("ERROR: Could not link source to gltrsnfrm") 
    sys.exit(1) 

if not gltrnsfrm.link(sink): 
   print("ERROR: Could not link gltrsnfrm  to sink") 
   sys.exit(1) 

# modify the gltransformation's properties 
gltrnsfrm.set_property("rotation-z",a) 
gltrnsfrm.set_property("rotation-x",b) 
gltrnsfrm.set_property("rotation-y",c) 

#dynamic controller
cs = GstController.InterpolationControlSource()
cs.set_property('mode', GstController.InterpolationMode.LINEAR)
cb= Gstcontorller.DirectControlBinding.new(gltrnsfrm,"rotation-x",cs)
gltrnsfrm.add_control_binding(cb)

#modify the values
cs.set(0*Gst.SECOND,b)  #use updated values of b
cs.set(1*Gst.SECOND,b)

В приведенном выше примере показано изменение только одного свойства элемента, однако у меня есть и другие свойства, которые нужно изменить на основе значений a,b & c.

Выполнение вышеуказанного скрипта дает мне следующую ошибку:

GStreamer-CRITICAL : gst_object_add_control_binding: assertion 'binding->pspec' failed. 

Я думаю, что мне нужно установить дополнительные атрибуты в python, чтобы это заработало. Кто-нибудь приложил руку к этому вопросу?

РЕДАКТИРОВАТЬ: После предложений Хью Фишера я попытался вернуться к источнику файла. Вот фрагмент из исходного кода:

GST_INFO_OBJECT (object, "trying to put property '%s' under control",
  binding->name);

/* check if the object has a property of that name */
if ((pspec =
      g_object_class_find_property (G_OBJECT_GET_CLASS (object),
          binding->name))) {
GST_DEBUG_OBJECT (object, "  psec->flags : 0x%08x", pspec->flags);

/* check if this param is witable && controlable && !construct-only */
if ((pspec->flags & (G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE |
            G_PARAM_CONSTRUCT_ONLY)) ==
    (G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE)) {
  binding->pspec = pspec;
} else {
  GST_WARNING_OBJECT (object,
      "property '%s' on class '%s' needs to "
      "be writeable, controlable and not construct_only", binding->name,
      G_OBJECT_TYPE_NAME (object));
}
} else {
GST_WARNING_OBJECT (object, "class '%s' has no property '%s'",
    G_OBJECT_TYPE_NAME (object), binding->name);
}

gst_object_unref (object);

И это файл журнала для моего скрипта:

0:00:00.174410648 [336m 8309[00m       0xd1b750 [37mTRACE  [00m [00;01;31;44m     GST_REFCOUNTING gstobject.c:207:gst_object_init:<GstObject@0x10b0020>[00m 0x10b0020 new
0:00:00.174697421 [336m 8309[00m       0xd1b750 [37mTRACE  [00m [00;01;31;44m     GST_REFCOUNTING gstobject.c:207:gst_object_init:<GstObject@0x10b20f0>[00m 0x10b20f0 new
0:00:00.174716708 [336m 8309[00m       0xd1b750 [36mINFO   [00m [00m   gstcontrolbinding gstcontrolbinding.c:144:gst_control_binding_constructor:<gltrnsfrm>[00m trying to put property 'rotation-x' under control
0:00:00.174723927 [336m 8309[00m       0xd1b750 [37mDEBUG  [00m [00m   gstcontrolbinding gstcontrolbinding.c:150:gst_control_binding_constructor:<gltrnsfrm>[00m   psec->flags : 0x000000e3
0:00:00.174729088 [336m 8309[00m       0xd1b750 [33;01mWARN   [00m [00m   gstcontrolbinding gstcontrolbinding.c:161:gst_control_binding_constructor:<gltrnsfrm>[00m property 'rotation-x' on class 'GstGLTransformation' needs to be writeable, controlable and not construct_only
0:00:00.174733951 [336m 8309[00m       0xd1b750 [37mTRACE  [00m [00;01;31;44m     GST_REFCOUNTING gstobject.c:264:gst_object_unref:<gltrnsfrm>[00m 0x10a60e0 unref 4->3

(python3:8309): GStreamer-CRITICAL **: 10:37:00.609: gst_object_add_control_binding: assertion 'binding->pspec' failed

Согласно справочной странице gltransformation, свойства rotate-x/y/z доступны для записи и чтения. Также здесь есть ссылка приложения, которое получает данные из графического интерфейса и изменяет поворот -x/y/z для «gltransformation». Я понятия не имею, почему здесь, в моем случае, это проблема.

  #gst-inspect-1.0 gltransformation
  translation-x       : Translates the video at the X-Axis, in universal [0-1] coordinate.
                        flags: readable, writable
                        Float. Range:   -3,402823e+38 -    3,402823e+38 Default:               0 
  translation-y       : Translates the video at the Y-Axis, in universal [0-1] coordinate.
                        flags: readable, writable
                        Float. Range:   -3,402823e+38 -    3,402823e+38 Default:               0 
  translation-z       : Translates the video at the Z-Axis, in universal [0-1] coordinate.
                        flags: readable, writable
                        Float. Range:   -3,402823e+38 -    3,402823e+38 Default:               0 
  rotation-x          : Rotates the video around the X-Axis in degrees.
                        flags: readable, writable
                        Float. Range:   -3,402823e+38 -    3,402823e+38 Default:               0 
  rotation-y          : Rotates the video around the Y-Axis in degrees.
                        flags: readable, writable
                        Float. Range:   -3,402823e+38 -    3,402823e+38 Default:               0 
  rotation-z          : Rotates the video around the Z-Axis in degrees.
                        flags: readable, writable
                        Float. Range:   -3,402823e+38 -    3,402823e+38 Default:               0 

Редактировать 2: обновлен код с обходным решением проблемы:

class Thread(object):
def __init__(self):
    thread = threading.Thread(target=self.get)
    self.gltrnsfrm = Gst.ElementFactory.make("gltransformation","gltrnsfrm")
    thread.start()

def get(self):
   try:

        global a,b,c
        while True:
            self.gltrnsfrm.set_property("rotation-z",a)
            self.gltrnsfrm.set_property("rotation-x",b)
            self.gltrnsfrm.set_property("rotation-y",c)
            #time.sleep(0.01)
    except KeyboardInterrupt:
        pass

Остальной код такой же (с небольшой адаптацией для использования потоков), как описано ранее в посте. Однако следующий код был опущен:

#dynamic controller
cs = GstController.InterpolationControlSource()
cs.set_property('mode', GstController.InterpolationMode.LINEAR)
cb= Gstcontorller.DirectControlBinding.new(gltrnsfrm,"rotation-x",cs)
gltrnsfrm.add_control_binding(cb)

#modify the values
cs.set(0*Gst.SECOND,b)  #use updated values of b
cs.set(1*Gst.SECOND,b)

person gst    schedule 06.08.2018    source источник
comment
Я предполагаю, что объект привязки управления, ваш cb, ожидает найти GParamSpec для свойства 'mode' вашего объекта cs и/или GParamSpecs для свойств вращения-x/y/z вашего объекта gltrnsfrm. Скорее всего, режим cs, поскольку сообщение об ошибке относится к объекту привязки pspec. Надеюсь это поможет.   -  person Hugh Fisher    schedule 07.08.2018
comment
@HughFisher: добавлена ​​дополнительная информация об отладке, которая отображает информацию об объекте привязки. Не подскажете, что здесь можно сделать?   -  person gst    schedule 07.08.2018


Ответы (1)


Проблема здесь в том, что свойства gltransformation не поддаются контролю. т.е. у них нет флага GST_PARAM_CONTROLLABLE при создании свойства в коде.

Вы можете либо добавить управляемости к gltransformation, предложив исправление выше по течению, либо не полагаясь на управляемые свойства.

person ystreet00    schedule 07.08.2018
comment
Можно ли использовать «g_object_class_install_property» в скрипте python и изменять свойство? Или есть другой способ динамически установить вращение-x/y/z? - person gst; 07.08.2018
comment
Нет, g_object_class_install_property предназначен для подклассов. Вам не нужно использовать привязки элементов управления для динамической установки свойства. Вы можете просто звонить set_property столько раз, сколько захотите. - person ystreet00; 07.08.2018
comment
@ysteet00 в моем случае, я хочу получать обновленные значения (по крайней мере, каждые 100 мс), пока воспроизводится видео. Следующим шагом будет использование живого видео вместо gltestsrc. - person gst; 07.08.2018
comment
Затем вы можете сделать это, как вам нравится, используя любой метод, который вам нравится. будь то async/await, glib mainloop, запуск дополнительного потока python и т. д. - person ystreet00; 08.08.2018
comment
Я последовал вашему совету и продолжал звонить set_property, и это сработало. Однако рендеринг видео прерывистый — предыдущие кадры видны в дополнение к текущим кадрам. Любые предложения о том, как отфильтровать это и получить гладкий черный фон, кроме текущего кадра? Вот изображения rotation-y , вращение-y и вращение- я - person gst; 08.08.2018
comment
Похоже, что никто где-то не glClear()ил из предыдущего кадра. Можете ли вы опубликовать свой обновленный код? Возможно, об ошибке здесь - person ystreet00; 10.08.2018
comment
@ysteet00: обновил код. Я заменил gltestsrc на v4l2src, и он отлично работает с плавным видео. Я могу поднять ошибку один раз, вы подтверждаете, что я не делаю ничего плохого в приведенном выше коде :) - person gst; 10.08.2018
comment
Это была проблема в GStreamer, которая с тех пор была исправлена ​​благодаря этому вопросу :). Изменения находятся здесь. Ваш код выглядит хорошо - person ystreet00; 10.08.2018
comment
Также создано усовершенствование для динамического управления свойствами ротации здесь . - person gst; 14.08.2018