Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фреймворк GStreamer. Руководство разработчика приложений. Динамически изменяемые значения параметров объектов

Оригинал: GStreamer Application Development Manual
Авторы: Wim Taymans, Steve Baker, Andy Wingo, Ronald S. Bultje, Stefan Kost
Дата публикации: 21 мая 2014 г.
Перевод: А.Панин
Дата перевода: 21 июня 2014 г.

Глава 16. Динамически изменяемые значения параметров объектов

16.1. Начало работы

В рамках подсистемы изменения значений параметров объектов реализован легковесный, использующий метки времени механизм установки значений свойств объектов системы gobject в процессе обработки мультимедийного потока. В обычных условиях значения свойств изменяются с помощью функции g_object_set(). Изменение этих значений свойств с высокой скоростью, сопоставимой со скоростью обработки мультимедийного потока, для оказания непосредственного воздействия на его параметры практически невозможно. Контроллер учитывает время. Он функционирует, соединяя источники значений со свойствами с помощью привязок управления. Источники значений предоставляют значения для заданной метки времени, обычно находящиеся в диапазоне от 0.0 до 1.0. Привязки управления ставят в соответствие управляющим значениям свойства системы gobject, с которыми они связаны - выполняется преобразование типов и масштабирование целевого значения до диапазона значений свойства. В процессе работы все элементы постоянно передают данные об изменениях значений для заданного времени потока с целью обновления значений свойств системы gobject. Фреймворк GStreamer уже содержит несколько различных источников значений и привязок управления, но приложения могут объявлять свои собственные источники значений, создавая подклассы для соответствующих базовых классов.

Большая часть функций механизма изменения значений параметров объектов реализована в рамках объекта типа GstObject. Базовые классы для источников значений и привязок управления также включены в состав основной библиотеки фреймворка. Существующие реализации описанных примитивов расположены в библиотеке gstcontroller. Для их использования вам придется подключить следующие заголовочные файлы к исходному коду вашего приложения:
...
#include <gst/gst.h>
#include <gst/controller/gstinterpolationcontrolsource.h>
#include <gst/controller/gstdirectcontrolbinding.h>
...

При этом ваше приложение должно связываться с разделяемой библиотекой gstreamer-controller. Требуемые для компилятора и линковщика флаги могут быть получены с помощью инструмента pkg-config после передачи названия пакета gstreamer-controller-1.0.

16.2. Настройка механизма изменения значений параметров объектов

В том случае, если наш конвейер настроен и мы хотим управлять значениями некоторых параметров объектов, в первую очередь нам необходимо создать источник значений. Давайте используем источник значений с интерполяцией:
  csource = gst_interpolation_control_source_new ();
  g_object_set (csource, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL);
Теперь мы должны соединить источник значений со свойством системы gobject. Это делается с помощью привязки управления. Один источник значений может быть связан с несколькими свойствами объектов (и даже свойствами различных объектов) с помощью отдельных привязок управления.
      gst_object_add_control_binding (object, gst_direct_control_binding_new (object, "prop1", csource));

Источник значений данного типа получает новые значения свойств из списка изменений параметров с метками времени. Источник может, к примеру, убрать тишину при воспроизведении звука, сгладив изменения параметров. Данное поведение может быть настроено путем установки значения свойства режима источника значений. Другие источники значений, к примеру, могут формировать поток значений, вызывая функцию sin() для получения значений. Так как источники значений сами являются объектами типа GstObject, другие источники значений также могут быть связаны с описанными свойствами.

Теперь мы можем настроить некоторые управляющие значения. Эти управляющие значения являются значениями с плавающей точкой типа 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);

Теперь все готово для начала проигрывания мультимедийного потока. В том случае, если источник значений, к примеру, связан со свойством, задающим уровень звука, мы услышим эффект постоянного повышения звука в течение 1 секунды. Небольшое предупреждение: элемент изменения уровня звука, поставляемый в составе фреймворка GStreamer, имеет диапазон значений свойства, задающего уровень звука, от 0.0 до 4.0. В том случае, если описанный выше источник значений связывается с этим свойством, уровень звука будет повышен до 400 %.

Одно заключительное замечание: подсистема изменения значений параметров объектов может работать в режиме реального времени. Несмотря на это, значение свойства системы GObject, с которым связан источник значений, может быть изменено и с помощью функции g_object_set(). Это очень полезно в случае связывания свойств системы GObject с виджетами графического интерфейса. В момент, когда пользователь изменяет значение свойства с помощью виджета, может быть установлено значение свойства системы GObject, которое будет активно до того момента, когда следующий запрограммированный источник значений изменит его. Этот подход также работает при использовании нормализованных параметров. Он не работает с источниками значений, которые постоянно изменяют значение свойства (например, lfo_control_source).


Следующий раздел : Программные потоки