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

UnixForum





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

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

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

Глава 18. Автоматическая подгрузка плагинов

Из Главы 10, "Ваше первое приложение" мы узнали о том, как разработать простой мультимедийный проигрыватель для файлов формата Ogg/Vorbis. Используя альтернативные элементы, вы можете создать проигрыватели для других мультимедийных форматов, таких, как Ogg/Speex, MP3 или даже форматов видео. Однако, вместо этого вы, скорее всего, предпочтете создать приложение, которое сможет автоматически определять тип мультимедийных данных потока и автоматически генерировать лучший конвейер из возможных путем исследования всех доступных элементов в системе. Описанный процесс называется автоматической подгрузкой плагинов, а фреймворк GStreamer содержит ряд реализаций высококачественных механизмов автоматической подгрузки плагинов. Если вы ищете описание методики использования конкретного механизма автоматической подгрузки плагинов, вы можете далее не читать эту главу, а перейти непосредственно к Главе 20, "Компоненты для проигрывания мультимедийных потоков". В данной главе описывается концепция механизмов автоматической подгрузки плагинов и определения типов потоков. В ней будет рассказано о том, какие системы для динамического определения типа мультимедийного потока включены в состав фреймворка GStreamer, а также показана методика генерации конвейера из элементов декодирования для проигрывания данного мультимедийного потока. Эти же принципы используются и при построении конвейеров для перекодирования мультимедийных потоков. Благодаря полной динамике данной концепции, фреймворк GStreamer имеет возможность автоматически расширять свои возможности, предоставляя поддержку новых типов мультимедийных данных без необходимости адаптации системы автоматической подгрузки плагинов к этим типам данных.

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

18.1. Типы мультимедийных потоков как способ идентификации этих потоков

Ранее мы ввели концепцию возможностей в качестве способа взаимодействия элементов (или точек соединения), предназначенного для согласования типа данных мультимедийного потока при передаче его следующему элементу конвейера (обратитесь к разделу с названием "Возможности точек соединения"). Мы выяснили, что возможность является комбинацией типа мультимедийных данных и набора свойств. При работе с большинством контейнерных форматов (это форматы файлов, которые вы можете найти на вашем диске; например, формат Ogg является контейнерным форматом) для описания потока не требуется свойств. Необходим исключительно тип мультимедийного потока. Полный список типов мультимедийных потоков и соответствующих им свойств находится в Руководстве разработчика плагинов.

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

Из Главы 10, "Ваше первое приложение" мы узнали о том, как создать простой мультимедийный проигрыватель для файлов формата Ogg/Vorbis. Давайте рассмотрим типы мультимедийных потоков, ассоциированные с каждой точкой соединения конвейера данного проигрывателя. На Рисунке 18.1, "Конвейер приложения Hello world с указанием типов мультимедийных потоков" приведены типы мультимедийных потоков, соответствующие каждой из точек соединения данного конвейера.

Рисунок 18.1, Конвейер приложения Hello world с указанием типов мультимедийных потоков
Конвейер приложения Hello world с указанием типов мультимедийных потоков

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

18.2. Определение типов мультимедийных потоков

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

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

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

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

После того как тип мультимедийного потока определен, вы можете добавить элемент (например, демультиплексор или декодер), соединив его с выходной точкой соединения элемента определения типа мультимедийного потока и начать декодирование мультимедийного потока.

18.3. Динамическое формирование конвейера

Обратитесь к Главе 20, "Компоненты для проигрывания потоков" для получения информации о высокоуровневых объектах, которые вы можете использовать для динамического формирования конвейеров.


Следующий раздел : Манипуляции с конвейером.