GStreamer: a flexible, fast and multiplatform multimedia framework
GStreamer is an extremely powerful and versatile framework for creating streaming media applications. Many of the virtues of the GStreamer framework come from its modularity: GStreamer can seamlessly incorporate new plugin modules. But because modularity and power often come at a cost of greater complexity, writing new applications is not always easy.
Installing GStreamer – Download and install GStreamer
Tutorials – Learn how to use GStreamer
Application Development Manual – Complete walkthrough for building an application using GStreamer
Plugin Writer’s Guide – Complete walkthrough for writing your very own GStreamer plugin
Deploying your application – Deploy GStreamer with your application
API reference – All the GStreamer libraries from the various components
Plugins – All the GStreamer plugins from its various components
The results of the search are
Знакомство с GStreamer: Введение
Данная статья ориентирована на начинающих программистов, которые не знакомы с GStreamer и хотят с ним познакомиться. Опытные разработчики навряд ли найдут для себя что-то новое в этой статье.
Преамбула
Многие наверное слышали, что есть такая вещь как GStreamer, или же видели как Ubuntu и ей подобные дистрибутивы предлагают установить различные пакеты, в названии которых содержится «gstreamer» при первой попытке воспроизвести mp3 или какой-нибудь иной файл с «не свободным» форматом медиаданных. Так вот, речь пойдет именно об этой библиотеке.
Введение
GStreamer — мощный фреймворк для построения мультимедийных приложений, который перенял идеи «video pipeline» от Oregon Graduate Institude, а так же что-то взял из DirectShow. Данный фреймворк позволяет создавать приложения различных уровней сложности, начиная от простого консольного плеера (можно воспроизвести какой-нибудь файл прям из терминала без написания какого-либо кода), заканчивая полноценными аудио/видео плеерами, мультимедийными редакторами и прочими приложениями.
GStreamer имеет плагинную архитектуру, и в стандартной поставке имеет очень большой набор плагинов которые могут решить 99% потребностей всех разработчиков мультимедийного ПО.
Архитектура
- Элементы
- 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.
При подготовке материала использовались источники:
https://gstreamer.freedesktop.org/documentation/
https://habr.com/ru/articles/178813/