Знакомство с GStreamer: Введение


Дисклеймер

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

Преамбула


Многие наверное слышали, что есть такая вещь как GStreamer, или же видели как Ubuntu и ей подобные дистрибутивы предлагают установить различные пакеты, в названии которых содержится «gstreamer» при первой попытке воспроизвести mp3 или какой-нибудь иной файл с «не свободным» форматом медиаданных. Так вот, речь пойдет именно об этой библиотеке.

Введение


GStreamer — мощный фреймворк для построения мультимедийных приложений, который перенял идеи «video pipeline» от Oregon Graduate Institude, а так же что-то взял из DirectShow. Данный фреймворк позволяет создавать приложения различных уровней сложности, начиная от простого консольного плеера (можно воспроизвести какой-нибудь файл прям из терминала без написания какого-либо кода), заканчивая полноценными аудио/видео плеерами, мультимедийными редакторами и прочими приложениями.

GStreamer имеет плагинную архитектуру, и в стандартной поставке имеет очень большой набор плагинов которые могут решить 99% потребностей всех разработчиков мультимедийного ПО.

Архитектура


В GStreamer есть несколько основных компонентов:
  • Элементы
  • Pads
  • Контейнеры bin и pipeline

А теперь подробнее:

Элементы


Практически все в GStreamer является элементом. Все, начиная от обычных источников потоков (filesrc, alsasrc, и т. п.), обработчиками потоков (демультиплексоры, декодеры, фильтры, и т. п.) и заканчивая конечными устройствами вывода (alsasink, fakesink, filesink, и т. п.).

Pads


Pad — это некая точка подключения элемента к другому элементу, если более просто — это входы и выходы элемента. Обычно они именуются «sink» — вход и «src» — выход.
Элементы всегда имеют как минимум один pad. Например, filesrc — элемент для чтения данных из файловой системы — имеет только один pad с названием «src», т. к. он не имеет входа, а может только превращать поток из файловой системы в внутреннее представление с которым уже будут работать другие элементы. Так же и элемент alsasink, он имеет один pad с названием «sink», т. к. он может только принимать внутренний поток и выводить его на звуковую карту через alsa. Элементы из разряда «filters» (те, которые как-то трансформируют поток) имеют две и более точек подключения. Например, элемент volume имеет pad с именем «sink», на который поступает поток, внутри этого элемента трансформируется (изменяется громкость), и через pad с названием «src» уже продолжает свой путь. Так же имеются элементы где может быть несколько как входов, так и выходов.

Контейнеры

Внутри контейнеров элементы проводят свой жизненный цикл. Контейнер управляет рассылкой сообщений от элемента к элементу, управляет статусами элементов. Контейнеры делятся на два вида:
  • Bin
  • Pipeline

Pipeline является контейнером верхнего уровня, он управляет синхронизацией элементов, рассылает статусы. Например, если pipeline установить статус PAUSED, этот статус будет автоматически разослан всем элементам которые находятся внутри него. Pipeline является реализацией Bin.
Bin — простой контейнер, который управляет рассылкой сообщений от элемента к элементу которые находятся внутри него. Bin обычно используется для создания группы элементов которые должны совершать какое-либо действие. Например, decodebin — элемент для декодирования потока, который автоматически выбирает нужные элементы для обработки потока в зависимости от типа данных (vorbisdec, theoradec, и т. п.) снимая с разработчика дополнительную работу.
Также имеются законченные самодостаточные контейнеры, такие как playbin. Playbin же, по сути является полноценным плеером, который содержит в своем составе все нужные элементы для воспроизведения аудио и видео, но как вы понимаете, гибкости нет никакой…

Как же это работает


Рассмотрим примерную схему примитивного плеера. Самая простая схема плеера должна иметь примерно такой вид:

Рассмотрим что тут происходит. Элемент filesrc читает файл из файловой системы и отправляет поток в контейнер decodebin, который же в свою очередь декодирует поток в внутреннее представление, и в последствии отправляет поток в элемент alsasink, который же, отправляет аудио-поток на звуковую карту. Для проверки данной схемы достаточно выполнения команды
gst-launch-1.0 filesrc location=/path/to/file.ogg ! decodebin ! alsasink

И в случае если вы услышали свою мелодию, значит все отлично.
Примечания

  • Утилита gst-launch-1.0 поставляется в пакете gstreamer1.0-tools
  • В случае использования OSS/Jack/и пр. данная схема может не сработать. Поэтому, alsasink можно заменить на элемент autoaudiosink, который сам выберет нужный элемент для вывода аудио.


Что дальше?


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

Ссылки


GStreamer 1.0 Core Reference Manual
GStreamer Application Development Manual
GStreamer Features

Следующая статья
  • +48
  • 41,2k
  • 8
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 8
  • 0
    Вот это очень полезный материал. Правда чуть чуть больше хотелось бы. На нем сделан тот самый хорошо здесь пропиаренный erlyvideo.org habrahabr.ru/post/114560/ на эрланге там всего лишь оболочка, на сколько я понял. А в основе все тот же GStreamer.
    • +2
      Обязательно постараюсь рассказать как можно больше про GStreamer! Информации о нем на русском языке очень и очень мало, а для чтения информации на иностранных источниках не у всех хватает знаний английского языка.
      На GStreamer основано очень много плееров, например: QuodLibet, Rhythmbox, Totem, Banshee, Foobnix.
      • 0
        Это штука уникальная. Народ, поддержите автора то! Первая статья и очень годная!
        Для всех кто будет запариваться с видеотрансляцией, потоковым вещанием на сайте!
        • +2
          Большое спасибо за поддержку!
      • 0
        нет.
        • 0
          на эрланге там всего лишь оболочка, на сколько я понял. А в основе все тот же GStreamer
          Нет.
      • 0
        С GStreamer хорошо интегрирован Moment Video Server. Через GStreamer захватывается/перекодируется видео, которое Moment раздаёт по протоколам RTMP, HLS и RTSP для клиентов Flash, iOS и Android.

        Благодаря GStreamer захватывать видео можно откуда угодно: с IP-камер, со спутниковых ресиверов, из файлов, рестримить потоки с других серверов и ещё множество вариантов.

        В бинарную сборку сервера, которую можно скачать на сайте, входит максимально полный GStreamer со всеми зависимостями. Помимо основного предназначения, её можно использовать для работы с самим GStreamer и для экспериментов. Утилиты gst-inspect и gst-launch — в комплекте. Есть сборки для Windows и для Linux, работают одинаково хорошо.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое