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

UnixForum





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

Фреймворк GStreamer. Руководство разработчика плагинов. Предисловие

Оригинал: GStreamer Plugin Writer's Guide
Авторы: Richard John Boulton, Erik Walthinsen, Steve Baker, Leif Johnson, Ronald S. Bultje, Stefan Kost, Tim-Philipp Muller, Wim Taymans
Дата публикации: 19 июля 2014 г.
Перевод: А.Панин
Дата перевода: 25 июля 2014 г.

Часть I. Введение

GStreamer является чрезвычайно мощным и гибким фреймворком, позволяющим создавать приложения для обработки потоковых мультимедийных данных. Многие достоинства фреймворка GStreamer обусловлены его модульной архитектурой: GStreamer позволяет осуществлять бесшовное подключение новых модулей в форме плагинов. Но платой за модульную архитектуру и развитые возможности обычно является усложнение программного продукта (вспомните, например, технологию CORBA), при этом разработка новых плагинов не всегда является простой задачей.

Данное руководство предназначено для облегчения понимания принципов работы фреймворка GStreamer (версии 1.3.90), которое в конечном итоге позволит вам разрабатывать новые плагины, расширяющие существующий набор функций фреймворка. В руководстве описана большая часть приемов, применяющихся в процессе разработки демонстрационного плагина аудиофильтра с использованием языка программирования C. При этом в следующих частях руководства также присутствует описание некоторых приемов, применяющихся при разработке других типов плагинов, а в конце руководства описываются некоторые особенности использования привязок для языка программирования Python, позволяющих использовать функции фреймворка GStreamer.

1. Предисловие

1.1. Обзор фреймворка GStreamer

GStreamer является фреймворком для создания приложений, обрабатывающих потоковые мультимедийные данные. Фундаментальное архитектурное решение, примененное в GStreamer, было создано на основе архитектуры конвейера для обработки видео, созданного в Oregon Graduate Institute, а также некоторых идей, взятых из подсистемы DirectShow.

Инструменты для разработки приложений из состава фреймворка GStreamer позволяют создавать приложения для обработки потоковых мультимедийных данных любого типа. Фреймворк GStreamer спроектирован таким образом, чтобы упростить разработку приложений, обрабатывающих потоки аудиоданных, видеоданных или потоки с аудио- и видеоданными. Он не ограничивает свои функции обработкой аудио- и видеоданных и может обрабатывать потоки данных любого типа. Архитектура конвейера разработана таким образом, что снижение производительности из-за использования конвейера не является существенным по сравнению со снижением производительности из-за использования фильтров. Это обстоятельство позволяет использовать фреймворк GStreamer даже при создании сложных приложений для обработки аудиоданных, которые предъявляют высокие требования к задержкам или производительности.

Одним из наиболее очевидных вариантов использования фреймворка GStreamer является создание на его основе мультимедийных проигрывателей. Фреймворк GStreamer уже содержит компоненты для создания мультимедийного проигрывателя с поддержкой широкого спектра форматов, включая MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quicktime, mod и другие. Однако, фреймворк GStreamer позволяет решать гораздо более сложные задачи, чем создание еще одного мультимедийного проигрывателя. Его основными достоинствами являются подключаемые компоненты, которые могут связываться для формирования произвольных конвейеров, что дает возможность разрабатывать на его основе полнофункциональное приложение для редактирования потоков аудио- или видеоданных.

Фреймворк основывается на плагинах, которые реализуют различные функции кодеков, а также дополнительные функции. Эти плагины могут связываться и размещаться в рамках конвейера. При этом конвейер будет устанавливать направление потока данных.

Основной функцией ядра фреймворка GStreamer является предоставление фреймворка для плагинов, механизма передачи данных, механизма синхронизации, а также механизма обработки/согласования типов мультимедийных данных. Он также предоставляет API для разработки приложений, использующих различные плагины.

1.2. Кому следует читать данное руководство?

В данном руководстве описывается методика разработки новых модулей для фреймворка GStreamer. Руководство может быть полезно следующим людям:
  • Любому человеку, который хочет добавить поддержку новых алгоритмов обработки данных в фреймворк GStreamer. Например, человек из этой группы может захотеть создать новый элемент для преобразования формата потока, новый инструмент визуализации или новый декодер или кодировщик потока.
  • Любому человеку, который хочет добавить поддержку новых устройств для ввода и вывода данных. Например, человек из этой группы может захотеть добавить возможность вывода данных мультимедийного потока с использованием интерфейса новой системы для вывода видео или возможность чтения потока данных, генерируемого видеокамерой или специальным микрофоном.
  • Любому человеку, который хочет расширить возможности фреймворка GStreamer каким-либо образом. В этом случае необходимо понимать принцип работы системы плагинов для того, чтобы осознавать ограничения, которые эта система накладывает на весь остальной код. Также после прочтения данного руководства может возникнуть удивление по поводу того, как много можно сделать на уровне плагинов.

Данное руководство не будет интересно вам в том случае, если вы хотите использовать исключительно существующие функции фреймворка GStreamer или в том случае, если вы хотите всего лишь использовать приложение, работающее с фреймворком GStreamer. Если вы заинтересованы исключительно в использовании существующих плагинов в ходе разработки нового приложения, а таких плагинов уже достаточно много, вам следует обратиться к Руководству разработчика приложений на основе фреймворка GStreamer под названием "GStreamer Application Development Guide". В том же случае, если вы ищете руководство по работе с приложением на основе фреймворка GStreamer, вам следует обратиться к руководству пользователя данного приложения.

1.3. Предварительное чтение

При написании данного руководства предполагалось, что вы знакомы с основными принципами работы фреймворка GStreamer. Для ознакомления с описанием концепций разработки приложений на основе фреймворка GStreamer в доступной форме вы можете предварительно прочитать Руководство разработчика приложений на основе фреймворка GStreamer ("GStreamer Application Development Manual"). Кроме того, следует рассмотреть остальную документацию, доступную на веб-сайте проекта GStreamer.

Для того, чтобы понимать информацию, изложенную в данном руководстве, вам понадобятся базовые знания в области программирования с использованием языка C. Так как фреймворк GStreamer использует объектную модель программирования GObject, при создании данного руководства также предполагалось, что вы знакомы с базовыми концепциями программирования с использованием объектной модели GObject. Наконец, вы можете обратиться к книге Eric Harlow под названием "Developing Linux Applications with GTK+ и GDK".

1.4. Структура данного руководства

Для облегчения вашей навигации по данному руководству, оно было разделено на несколько больших частей. В каждой из частей рассматривается определенная значительная тема, связанная с разработкой плагинов для фреймворка GStreamer. Части данного руководства распределены в следующем порядке:

  • Создание плагина - вводное описание структуры плагина с использованием плагина аудиофильтра в качестве иллюстрации.

    В данной части описываются основные шаги, которые вам следует выполнить в общем случае для создания плагина, такие, как регистрация элемента в рамках фреймворка GStreamer и настройка его основных параметров для того, чтобы он смог принимать данные и отправлять их соседним элементам. Дискуссия начинается с рассмотрения примеров генерации базовых структур и регистрации элемента в главе под названием "Создание шаблона плагина". После этого вы узнаете о том, как разрабатывать код для реализации функций простого плагина фильтрации потока данных в Главе 4, "Объявление точек соединения", Главе 5, "Функция цепочки" и Главе 6, "Обзор состояний".

    После всего этого мы продемонстрируем некоторые концепции использования объектной модели GObject, позволяющие реализовать функции настройки элемента средствами приложений, а также механизм взаимодействия по схеме "приложение-элемент" в главе под названием "Добавление свойств" и в Главе 10, "Сигналы". Далее вы узнаете о том, как создать простое тестовое приложение для тестирования всех механизмов, о которых вы только что узнали, в Главе 11, "Создание тестового приложения". В этой главе мы рассмотрим только самые важные вопросы разработки приложений. Для того, чтобы ознакомиться с подробным описанием принципов разработки приложений, вам следует обратиться к Руководству разработчика приложений на основе фреймворка GStreamer.

  • Сложные концепции фильтров - информация о сложных аспектах процесса разработки плагинов для фреймворка GStreamer.

    После ознакомления с базовыми этапами разработки плагинов, вы сможете создать работающий плагин для фильтрации аудио- или видеопотоков с некоторыми базовыми функциями. Однако, фреймворк GStreamer предоставляет разработчикам плагинов возможность реализации гораздо большего спектра функций плагинов на основе существующих механизмов. Эта часть руководства включает разделы, посвященные более сложным темам, таким, как планирование работы элемента, описания типов мультимедийных потоков в рамках фреймворка GStreamer, таймеры, интерфейсы и работа с тэгами. Ввиду того, описанные механизмы предназначены для конкретных целей, вы можете читать соответствующие главы в любом порядке, так как для чтения большей части этих глав не требуется информации из других глав.

    Первая глава под названием "Различные режимы планирования работы точек соединения элементов" описывает некоторые базовые аспекты процесса планирования работы элемента. Она не содержит большого количества описаний низкоуровневых механизмов и предназначена главным образом для разъяснения причин, по которым упомянутый механизм функционирует определенным образом. Читайте эту главу в том случае, если вас интересуют низкоуровневые интерфейсы фреймворка GStreamer. Впоследствии мы применим эти знания в обсуждении механизма передачи данных, отличного от того, который рассматривался в Главе 5, "Функция цепочки", в рамках все той же главы под названием "Различные режимы планирования работы точек соединения элементов". Элементы на основе петлевых связей позволят вам лучше контролировать интенсивность входного потоков данных. Они полезны, например, при реализации мультиплексоров и демультиплексоров.

    После этого мы будем обсуждать применяемый в рамках фреймворка GStreamer механизм идентификации мультимедийных потоков в Главе 16, "Типы и свойства мультимедийных потоков". Вы узнаете о том, как объявляются новые типы мультимедийных потоков, а также познакомитесь со списком стандартных типов мультимедийных потоков, объявленных в рамках фреймворка GStreamer.

    Из следующей главы вы узнаете о концепции создаваемых по запросу и не постоянно доступных точек соединения, которые по своей сути являются точками соединения, создаваемыми динамически либо при поступлении запроса от приложения (создаваемые по запросу), либо при возникновении необходимости в ходе обработки мультимедийного потока (не постоянно доступные). Эти вопросы будут обсуждаться в Главе 12, "Создаваемые по запросу и не постоянно доступные точки соединения".

    В следующей Главе 18, "Таймеры", будут даны пояснения относительно концепции таймеров в рамках фреймворка GStreamer. Эта информация понадобится вам в том случае, если вы захотите разобраться в вопросе синхронизации аудио- и видеопотоков на уровне элементов.

    В нескольких следующих главах обсуждаются сложные методики осуществления взаимодействия по схеме "приложение-элемент". Ранее мы обсуждали способ выполнения аналогичных действий с помощью механизмов объектной модели GObject в главе под названием "Добавление свойств" и Главе 10, "Сигналы". Мы обсудим динамические параметры, которые позволяют заранее настроить поведение элемента в будущем, в Главе 20, "Поддержка динамических параметров". После этого вы узнаете об интерфейсах из Главы 21, "Интерфейсы". Интерфейсы являются очень специфичными для задач механизмами для осуществления взаимодействия по схеме "приложение-элемент", базирующимися на классе GInterface объектной модели GObject. Наконец, вы узнаете о том, как в рамках фреймворка GStreamer осуществляется обработка метаданных из Главы 22, "Работа с тэгами (Метаданные и параметры мультимедийного потока)".

    В последней Главе 17, "События: Перемещение в мультимедийном потоке, навигация и другие действия", мы обсудим концепцию событий в рамках фреймворка GStreamer. С одной стороны, события являются дополнительным механизмом для осуществления взаимодействия по схеме "приложение-элемент". Этот механизм, к примеру, заботится о выполнении операций перемещения в мультимедийном потоке. С другой стороны, они также являются механизмом для осуществления таких взаимодействий элементов друг с другом, как распространение информации о нарушениях целостности мультимедийного потока, передача данных тэгов в рамках конвейера и.т.д.

  • Создание элементов специальных типов - описание методики разработки плагинов других типов.

    Так как в двух первых частях данного руководства мы используем в качестве примера элемент аудиофильтра, описанные в них концепции являются специфичными для плагинов фильтров. Но при этом многие концепции одинаково применимы и к плагинам других типов, включая плагины для ввода данных, плагины для вывода данных и плагины для автоматического формирования конвейеров. В данной части руководства описаны проблемы, которые возникают при работе с этими более специализированными типами плагинов. Часть начинается с подробного описания элементов, которые могут быть разработаны с использованием базового класса (глава под названием "Предварительно созданные базовые классы"), с последующим переходом к описанию процесса разработки специальных типов элементов в главах с названиями "Разработка демультиплексора или элемента для разбора потока данных", "Разработка элемента для разделения потока данных по схеме N-к-1 или мультиплексора" и "Разработка элемента управления".

  • Приложения - дополнительная информация для разработчиков плагинов.

    Приложения содержат информацию, которая не может быть явно отнесена ни к одной из других частей данного руководства. Работа над большей частью глав данного раздела все еще не закончена.

Данная вводная часть руководства также содержит краткий обзор базовых концепций, связанных с разработкой плагинов для фреймворка GStreamer. Круг рассматриваемых тем включает "Элементы и плагины", "Точки соединения", "Данные, буферы и события", а также "Типы и свойства мультимедийных потоков". Если вы уже знакомы с данной информацией, можете использовать этот краткий обзор для освежения памяти, в противном случае можете просто пропустить его и приступить к чтению главы под названием "Создание плагина".

Как видите, в руководстве содержится достаточно много полезной информации, поэтому давайте начнем изучение! Некоторые наиболее интересные темы:
  • Создание неоднородных и сложных элементов путем расширения возможностей класса GstBin. Эта операция позволит вам создать плагины, которые будут работать со встроенными в них плагинами.
  • Добавление новых типов мультимедийных данных в реестр наряду с использованием функций определения типа мультимедийного потока. Эта операция позволит вашему плагину работать с совершенно новым типом мультимедийного потока.

Следующий раздел : Глава 2. Базовые сведения.