Содержание


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

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

Comments

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

Решением этой проблемы может стать использование 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, пришла очередь изучить их реализацию. Для этого необходимо ввести несколько новых понятий.

Как упоминалось, главным понятием в обработке является 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

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 можно найти того человека, который поможет вам или которому сможете помочь вы.


Ресурсы для скачивания


Похожие темы

  • Multipurpose multimedia processing with GStreamer (EN): оригинал статьи
  • GStreamer Application Development Manual: дополнительная информация о GStreamer и его возможностях при разработке приложений.
  • GStreamer Plugin Writer's Guide: руководство для создания собственных плагинов.
  • GStreamer 0.10 Core Reference Manual: справочное руководство по GStreamer.
  • GObject Reference Manual: это руководство позволит узнать больше об объектно-ориентированной библиотеке, используемой GStreamer.
  • AIX® и UNIX: раздел AIX и UNIX сайта developerWorks предоставляет много различной информации, относящийся ко всем аспектам системного администрирования AIX и приемам работы с UNIX.
  • Домашняя страница GStreamer: на этом сайте размещены последние обновления и дистрибутивы GStreamer.
  • Istanbul: приложение на базе GStreamer для записи сеансов на настольном компьютере.
  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить со страницы сообщества developerWorks.

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

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