Комплексная обработка мультимедиа при помощи GStreamer

Универсальное решение для различных задач

Эта статья познакомит вас с GStreamer, универсальной библиотекой для обработки мультимедиа, которая упрощает работу с данными мультимедиа.

Мацей Катафьяж, студент, будущий it-специалист

Мацей Катафиш (Maciej Katafiasz) является аспирантом в области компьютерных наук и еще со средней школы использует технологии с открытым исходным кодом. Он пользуется рабочим столом GNOME с версии 1.0, а после версии 2.0 Мацей выучил GTK+, чтобы развивать любимый рабочий стол.



31.03.2008

Сегодня мультимедиа-информация может быть представлена в большом количестве форматов. Существует множество форматов для хранения видео- и аудиоматериалов. К сожалению, для работы с таким множеством форматов требуется знание большого числа специализированных "одноформатных" инструментов.

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

Преимущества такого универсального подхода заметны сразу. Вместо того чтобы писать на MP3-плеер или AVI/DivX-плеер, можно сразу вести запись на аудио- или видеоплеер. Когда потребуется добавить поддержку нового формата, то не потребуется изучать новую библиотеку и писать код на ее основе. Вместо этого достаточно просто установить plug-in для этого формата. Это все, что потребуется, не возникнет даже потребности в перекомпиляции. Все GStreamer-приложения способны подхватывать новые форматы "на лету".

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

Основные принципы

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

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

  • перекодирование MP3 файлов в формат Ogg Vorbis
  • воспроизведение AVI файлов
  • захват видео в реальном времени с DV источника (IEEE1394) и сохранение его в формате MPEG2

Для достижения такого многообразия результатов GStreamer оперирует абстрактным понятием pipeline (конвейера). Pipeline - это направленный граф, в котором медиаданные протекают в заданном направлении - от входа к выходу. Pipeline состоит из element'ов (элементов), и это еще одно ключевое понятие. Element - это объект, который помещается в pipeline и позволяет выполнить определенное преобразование медиаданных. Можно связать элементы между собой, чтобы они вместе организовали процесс, которые преобразует входные данные в требуемый формат выходных. Для наглядности считается, что поток данных через pipeline проходит слева (входящий поток) направо (выходящий поток). Такой же подход применяется для описания конвейера при помощи инструмента gst-launch, как будет показано ниже.

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

Сам по себе GStreamer не содержит элементов, главная его задача - создание конвейера из предоставленных элементов. Конкретные задачи решаются при помощи плагинов. Каждый плагин, распространяемый в виде откомпилированного файла (.so для Unix® или .dll для Microsoft® Windows®), содержит один или несколько элементов. При запуске GStreamer опрашивает все установленные плагины, чтобы собрать список доступных элементов. Обычно плагин не сам выполняет обработку мультимедиа, а взаимодействует с другими библиотеками для данных задач: например, декодер MPEG2 вызывает существующую библиотеку для работы с MPEG-форматом. Однако подобное делегирование выполняется прозрачно для приложения, и оно взаимодействует только с элементами с общим интерфейсом.

Некоторые плагины распространяются в базовых пакетах и представляют собой единую библиотеку, состоящую из различных элементов. Другие базовые плагины распространяются в пакете gst-plugins-base. Они имеются в большинстве вариантов установки GStreamer. Также есть gst-plugins-good, -bad и -ugly пакеты, где подобраны различные плагины в зависимости от уровня поддержки и принципа распространения. Наконец, есть плагины, распространяемые сторонними производителями и предназначенные для ограниченного использования только одним приложением.

Пример использования GStreamer

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

Путаница в названиях - sink (англ. выброс) - это вход, а source (англ. источник) - выход?!

На самом деле путаницы нет. Через sink pad (точку входа) в элемент поступают данные, а в source pad (точке выхода) другого элементa они начинаются. Поэтому элемент только с точками выхода называется source (источник), а элемент только с точками входа называется sink (потребитель). Так что все просто, несмотря на кажущуюся логическую ошибку.

Как упоминалось, главным понятием в обработке является element, представленный классом GstElement. GStreamer написан на C, но использует библиотеку GObject из GTK+ для дополнительных ООП возможностей (см. раздел Ресурсы). Этот GstElement имеет две pads (точки стыковки) с другими элементами GStreamer. Есть два типа pads:

  • sink pad, точка входа для медиаданных.
  • source pad, точка выхода данных, обработанных элементом.

У pad есть параметры, называемые caps (насадки), определяющие данные какого формата могут проходить через pad. Например, листинг 1представляет код для элемента vorbisdec, который декодирует свободный формат Vorbis. Знак доллара $ в начале строки указывает, что это обычная команда оболочки UNIX.

Листинг 1. Фрагмент описания элемента vorbisdec
$ gst-inspect-0.10 vorbisdec

[...]

Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:
      audio/x-raw-float
                   rate: [ 8000, 50000 ]
               channels: [ 1, 6 ]
             endianness: 1234
                  width: 32

  SINK template: 'sink'
    Availability: Always
    Capabilities:
      audio/x-vorbis

[...]

Как мы видим, в фрагменте объявлены два шаблона pad: один для вывода данных (src), другой для ввода (sink). Pad для вывода доступен постоянно (Always) и поддерживает следующий шаблон воспроизводимых данных: необработанное аудио с частотой от 8 до 50 кГц, от одноканального до шестиканального, с прямым порядком байтов и 32-битными сэмплами. Другие возможные варианты типа доступа: иногда (sometimes) и всегда (request). Шаблон входного pad также обеспечивает постоянный доступ и позволяет принимать аудио в формате Vorbis.

Эти шаблоны крайне важны для корректной работы конвейера. При попытке связать вместе два элемента, чтобы сформировать конвейер, GStreamer проверяет, совместимы ли шаблоны pad'ов связываемых элементов. Этот процесс называется negotiation (переговоры). Во время переговоров элементы пытаются подобрать лучший формат из тех, которые они оба могут поддерживать. Если это не удается, то связывание элементов не выполняется. Если же они выбирают общий формат, то этот формат уже не один из возможных шаблонов, а fixed caps - однозначно утвержденный формат обмена данными. Теперь данные могут передаваться от одного элемента к другому.

Представленной информации вполне достаточно для начала работы с GStreamer. Для этого потребуется универсальный инструмент для GStreamer - gst-launch.


Работа с gst-launch

Другие утилиты GStreamer

В дополнение к gst-launch GStreamer предлагает другие крайне полезные утилиты, такие как gst-inspect и gst-typefind.

Когда неизвестно, как применить какой-либо element, воспользуйтесь gst-inspect. По имени запрашиваемого элементa или плагина gst-inspect выведет все сведения, которые GStreamer может предоставить о нем.

Используя gst-typefind, GStreamer-аналог file(1)-утилиты UNIX, можно узнать тип файла, точнее, к какому типу относит этот файл сам GStreamer.

gst-launch - это универсальная программа с широкими возможностями. Для GStreamer инструмент gst-launch - это то же самое, что оболочка shell для UNIX. С его помощью можно создавать сложные конвейеры, используя специальный синтаксис команд gst-launch, как показано в листинге 2.

Листинг 2. Использование утилиты gst-launch
$ gst-launch-0.10 filesrc location=
  "concept.mp3" ! decodebin ! alsasink

Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: audioclock0

Код из листинга 2 представляет собой простейший аудиоплеер, использующийся для воспроизведения файла concept.mp3. В таблице 1 приводится подробный разбор кода.

Таблица 1. Разбор кода листинга 2 по фрагментам
фрагментописание
gst-launch-0.10Имя самой команды. -0.10 означает, что должна использоваться версия GStreamer 0.10, если имеются другие установленные версии.
filesrc location="concept.mp3"Создается element класса filesink (приемник файлов) и устанавливается его свойство location (местоположение) на файл concept.mp3. Этот элемент может считывать файлы, указанные в location, и запустит программу считывания файла concept.mp3 в текущем каталоге.
! Восклицательный знак означает связать с (link to). Похожий на символ | оболочки shell, он был выбран из-за внешнего сходства и так как может использоваться без обработки в shell, если окружен пробелами.
decodebin Это важнейший элемент в составе Gstreamer - autoplugger (компоновщик). Используя типы данных, заданные его для входа и выхода, он просматривает все доступные элементы, чтобы организовать sub-pipeline, который обеспечит требуемый результат. Входные/выходные форматы всех элементов GStreamer должны быть явно указаны, поэтому восклицательный знак (!) неявно предоставляет информацию о форматах элементов, которые им связаны. Так как filesrc имеет cap типа ANY, то первой задачей decodebin является определение фактического формата потока (typefind). Для этого он считывает параметры, которые определяют тип данных. Все эти действия выполняются прозрачно для пользователя.
alsasinkЭтот элемент используется для вывода аудио в Linux®. Он взаимодействует со звуковой картой и выводит на нее подготовленные аудиоматериалы. Также он контролирует пропускную способность конвейера, так как звуковая карта может воспринимать данные только с определенной скоростью.

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

Как мы видим, GStreamer позволяет значительно упростить обработку медиаданных. Нет даже необходимости знать точный формат материалов, которые необходимо преобразовать. Однако, как оболочка shell не способна заменить программы на языке С, так и gst-launch не может заменить полноценное приложение GStreamer. Например, gst-launch не может контролировать работу конвейера после его запуска, что не позволяет пропускать ненужные участки в потоке данных. Несмотря на эти ограничения gst-launch невероятно удобный инструмент для быстрого решения простых задач, таких как перекодирование файлов из одного формата в другой.


Продолжение знакомства с GStreamer

Эта статья представляет собой только краткое введение по использованию GStreamer. Конечно, забавно создать аудиоплеер, используя только команды оболочки, однако это будет очень аскетичный плеер без интерфейса пользователя и возможности управления. Чтобы добавить эти и другие возможности придется написать немного кода. Для этого достаточно просто воспользоваться GStreamer API из-за его четкой архитектуры. А если язык С не подходит, то можно выбрать другую среду, например активно поддерживаемую Python-версию.

Полное руководство по gst-launch можно найти в соответствующем разделе man. Его синтаксис позволяет создавать более сложные и интересные конвейеры, включая те, которые можно придумать самим. Также можно создать свой вариант gst_launch, более подробно эта возможность разбирается в разделе документации по функции gst_parse_launch().

Кроме того, вы можете присоединиться к списку рассылки или IRC-каналу (#gstreamer@irc.freenode.net). В сообществе разработчиков GStreamer можно найти того человека, который поможет вам или которому сможете помочь вы.

Ресурсы

Научиться

Получить продукты и технологии

  • Домашняя страница GStreamer: на этом сайте размещены последние обновления и дистрибутивы GStreamer.
  • Istanbul: приложение на базе GStreamer для записи сеансов на настольном компьютере.
  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить со страницы сообщества developerWorks.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=298751
ArticleTitle=Комплексная обработка мультимедиа при помощи GStreamer
publish-date=03312008