Как стать автором
Обновить

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

Время на прочтение 3 мин
Количество просмотров 75K

Дисклеймер

Данная статья ориентирована на начинающих программистов, которые не знакомы с 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
Комментарии 8
Комментарии Комментарии 8

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн