Gstreamer应用开发手册9:动态控制参数

入门

GStreamer属性通常是使用g_object_set()设置的,但是想实时地调用来更改流几乎是不可能的。控制器子系统提供了一种轻量级的方法来在流运行时调整GObject属性。

控制器要考虑到时间影响,它通过GstControlSource控件来修改属性。控制源提供0.0到1.0的范围的时间戳的值。控件绑定将控件值映射到GObject它们绑定到的属性,将类型转换并缩放到目标属性的值范围。在运行时,元件在当前流时间连续提取值的更改来更新GObject属性。GStreamer已经包含一些不同的GstControlSources和控件绑定,但是应用程序可以通过对各个基类进行子类化来定义它们自己的。

控制器机制的大部分都在GstObject中实现。GstControlSources的基类和控件也包含在核心库中,但是现有的实现包含在gstcontroller库中,因此您需要根据需要在应用程序的源文件中包含这些头文件。

#include <gst/gst.h>
#include <gst/controller/gstinterpolationcontrolsource.h>
#include <gst/controller/gstdirectcontrolbinding.h>
...

除了包含头文件之外,应用程序还应链接到 gstreamer-controller共享库。可以使用下边的指令来获取所需的编译器和链接器标志:

pkg-config --libs --cflags gstreamer-controller-1.0

设置参数

如果我们已建立管道并希望控制某些参数,则首先需要创建一个GstControlSource。

csource = gst_interpolation_control_source_new ();
g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);

现在,我们需要将GstControlSource附加到gobject属性。这是通过控件绑定完成的,可以使用单独的控件绑定将一个控制源附加到多个对象属性(甚至在不同的对象中)。

gst_object_add_control_binding (object, gst_direct_control_binding_new (object, "prop1", csource));

GstControlSource从带有时间戳的参数更改列表中获取新的属性值。例如,源可以通过平滑参数更改来填补空白。可以通过设置GstControlSource的属性来配置此行为。其他控制源例如通过调用sin()函数产生流,它们可以控制参数例如频率。由于GstControlSources也是GstObjects,因此也可以将GstControlSources 附加到这些属性。

现在我们可以设置一些控制点。这些是带时间戳的gdouble值,通常在0.0到1.0的范围内,1.0映射到目标属性值范围内的最大值。达到时间戳后,这些值将变为活动状态。他们仍然留在列表中。例如,如果管道运行一个循环(使用分段搜索),则控制曲线也会重复。

GstTimedValueControlSource *tv_csource = (GstTimedValueControlSource *)csource;
gst_timed_value_control_source_set (tv_csource, 0 * GST_SECOND, 0.0);
gst_timed_value_control_source_set (tv_csource, 1 * GST_SECOND, 1.0);

现在一切准备就绪,如果将GstControlSource绑定到volume属性,我们将听到1秒钟的淡入。一个警告:GStreamer的声音元件具有的volume属性范围是0.0到10.0。如果将以上GstControlSource内容附加到此属性,则音量将增加到400%!

最后一点:控制器子系统具有内置的实时模式。即使已分配GstControlSource属性,也可以通过g_object_set()设置 GObject属性。将GObject属性绑定到GUI小部件时,这非常有用。当用户使用窗口小部件调整值时,可以设置该GObject属性,并且该属性将保持激活状态,直到下一个GstControlSource值将其覆盖。这也适用于平滑的参数,但不适用于不断更新属性的GstControlSource,例如GstLFOControlSource。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页