Релиз GStreamer 1.22.0
Команда разработчиков объявила о выпуске новой версии инструмента для создания мультимедийных приложений, называемого GStreamer 1.22. Этот кроссплатформенный набор компонентов может использоваться для различных целей, от медиаплееров и конвертеров до приложений для голосовой связи и систем потокового вещания. Новая версия обеспечивает совместимость с предыдущими версиями и будет доступна для использования на различных операционных системах.
- Новая версия инструмента для обработки видео предлагает улучшенную поддержку формата AV1 и возможность использования аппаратного ускорения для кодирования и декодирования. Добавлены новые RTP-обработчики и улучшен разбор формата AV1 в различных контейнерах.
- Поддержка Qt6 и новые элементы для отрисовки видео внутри сцены QML.
- Добавлены новые элементы для отрисовки используя GTK4 и Wayland.
- Новые клиенты для адаптивного стриминга, поддерживающие HLS, DASH и MSS.
- Предоставлена возможность создания урезанных сборок для сокращения размера.
- Добавлена поддержка распределенного кодирования и передачи видео с использованием WebRTC и контролем загруженности сети.
- Реализован новый плагин для отправки медиапотоков через WebRTC.
- Добавлены новые элементы, написанные на языке Rust. Эти плагины, называемые gst-plugins-rs, могут быть использованы в программах на любом языке и их использование схоже с плагинами, написанными на C и C++. Около трети изменений в новой версии GStreamer связаны с плагинами на Rust, которые являются одним из самых активно развиваемых модулей GStreamer. Плагины на Rust также поставляются в официальных бинарных пакетах для Windows и macOS.
- Реализован новый медиасервер, основанный на языке Rust, который использует WebRTC и поддерживает функциональность для ввода и вывода медиаданных.
- Добавлен компонент videocolorscale, объединяющий в себе функциональность для конвертации и масштабирования видео.
- Улучшена поддержка видео с высокой глубиной цвета.
- В API Navigation добавлена возможность обработки событий с сенсорных экранов.
- Добавлены элементы коррекции временных меток H.264/H.265 для реконструкции PTS/DTS перед упаковкой медиаконтейнеров.
- На платформе Linux улучшено применение DMA для совместной работы с буферами при кодировании, декодировании, фильтрации и отрисовке видео с применением аппаратного ускорения.
- Новые аппаратно ускоренные кодировщики видео в форматах H.264 / AVC, H.265 / HEVC и AV1, построенные с использованием SDK AMF, были реализованы для GPU AMD.
- Поддержка кодирования и декодирования видео H.265 / HEVC добавлена в плагин applemedia.
- Плагин androidmedia получил возможность кодирования видео H.265 / HEVC.
- В плагины audiomixer, compositor, glvideomixer и d3d11compositor добавлено свойство force-live, позволяющее принудительно включать live-режим.
Original_1
25.01.23 19:46:43 MSK
Проверено: hobbit ( 25.01.23 22:13:48 MSK )

GStreamer это хорошо, приходилось прогать с этой штукой, радостная новость
I-Love-Microsoft ★★★★★
( 25.01.23 22:34:19 MSK )
Какой к черту инструмент?
Этому фреймворку уже 100 лет. И по моему, он так и не взлетел, хотя был очень многообещающий.
AVL2 ★★★★★
( 26.01.23 21:23:20 MSK )
Ответ на: комментарий от AVL2 26.01.23 21:23:20 MSK

Всем бы так не взлететь.
Polugnom ★★★★★
( 26.01.23 21:29:17 MSK )
Ответ на: комментарий от Polugnom 26.01.23 21:29:17 MSK
а где он взлетел?
в плейерах? parole этот?
smplayer работает, vlc работает, а в этом пароле я знаю только диалог «что то пошло не так». Видеоредакторы? Да тоже как только узнаешь, что он на gstreamer, сразу понятно, не работает.
AVL2 ★★★★★
( 26.01.23 22:36:43 MSK )
Ответ на: комментарий от AVL2 26.01.23 22:36:43 MSK

alex1101 ☆
( 26.01.23 22:51:21 MSK )
Ответ на: комментарий от AVL2 26.01.23 22:36:43 MSK

там огромный список, а не только Parole.
Polugnom ★★★★★
( 26.01.23 23:09:14 MSK )
Ответ на: комментарий от alex1101 26.01.23 22:51:21 MSK
Там чуть ли не половина ссылок – битые.
skvitek ★★★
( 27.01.23 10:24:29 MSK )
Ответ на: комментарий от Polugnom 26.01.23 23:09:14 MSK
Если даже плейеры не работают? Собственно, весь негатив связан с тем, что когда это проект появился, на него были огромные надежды. Звучало все очень и очень многообещающе, типа джека, только сразу для аудио-видео.
По факту проблемы с патентами и стабильностью все испортили. Возможно, забежали вперед, железо не потянуло. В общем, имхо, не взлетело. Теперь pipewire уже есть, вероятно, он заменит и пульс и этот стример.
AVL2 ★★★★★
( 31.01.23 17:05:48 MSK )
Ответ на: комментарий от AVL2 31.01.23 17:05:48 MSK

Gstreamer про другое: быстро наваять свои плагины, смешать с имеющимися и запилить приложение. Потому популярен в эмбеддеде. Для плееров он довольно избыточен, pipewire тут вообще не при чем, это разные вещи.
Знакомство с 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.
Знакомство с GStreamer: Источники данных
Здравствуй, хабраюзер, интересующийся фреймворком GStreamer! Сегодня мы поговорим о источниках медиа-данных (sources), и тем самым продолжим курс статей посвященный GStreamer.
Вступление

Источники данных — это класс плагинов GStreamer который позволяет читать медиаданные из различных источников, таких как файловая система или аудио-входы звуковой карты. Также, они позволяют получать медиапоток с различных серверов потокового вещания, такие как HTTP (ICECast, ShoutCast), RTSP, RTMP, TCP и UDP. А еще имеется возможность читать данные с DVB карт, CDDA-дисков (народе известных просто как «компакт-диски»), и еще много всего, при помощи различных плагинов, которых на данный момент около 30.
Примечание: как говорилось в прошлой статье, источники данных имеют только один pad с названием src, так как его можно подключить к другому элементу, но к нему подключить ничего нельзя.
В этой статье мы разберем некоторые (пожалуй, наиболее востребованные) источники данных, напишем немного кода на Python и узнаем много нового.
Поехали
0. gst-launch-1.0
Утилита gst-launch-1.0 позволяет запускать GStreamer pipeline без написания единой строчки кода. Я буду ее использовать для запуска небольших примеров, и что нам требуется знать сегодня — так это то, что запуск pipeline имеет примерно такой вид:
gst-launch-1.0 описание-pipeline
а описание pipeline, в свою очередь, делится на описание элементов вида
element1 property1=value1 property2=value2 ! element2
Вроде в этой схеме все понятно, есть элемент типа element1 с свойствами property1 и property2 которые имеют значения value1 и value2 соответственно, и есть элемент типа element2. Символ «!» указывает на то, что выход element1 необходимо соединить с входом element2.
На этом возможности gst-launch не ограничиваются, просто в сегодняшней статье они нам не пригодятся и будут рассмотрены в дальнейшем.
1. filesrc
filesrc — на мой взгляд, это самый часто используемый источник мультимедийных данных. Как можно понять из его названия, он является элементом для чтения данных из файлов. В прошлой статье мы рассматривали схему примитивного плеера, в котором фигурировал filesrc как источник данных.
Элемент filesrc имеет несколько параметров. Рассмотрим некоторые из них.
location
Свойство location должно содержать путь к файлу, из которого необходимо производить чтение.
Пример: /foo/bar.mp3
blocksize
Данный параметр устанавливает размер буфера чтения. Значение должно быть описано беззнаковым числом.
num-buffers
Количество блоков, после прочтения которых будет отправлено сообщение EOS.
Свойства blocksize и num-buffers можно не указывать. В этом случае будут использованы значения по умолчанию. А еще указанные свойства имеются у всех источников данных, и далее рассматриваться не будут.
Пример использования источника filesrc возьмем из предыдущей статьи:
gst-launch-1.0 filesrc location=/foo/bar.mp3 ! decodebin ! autoaudiosink
2. souphttpsrc
Элемент souphttpsrc предоставляет возможность чтения данных поверх HTTP (HTTPS) протокола. Чтение может производиться как из обычного файла, доступного через HTTP протокол, так и с ICECast/ShoutCast сервера. Также данный элемент позволяет производить чтение данных поверх протоколов ICY и ICYX. По данным протоколам я никакой информации найти не смог.
souphttpsrc имеет чуть больше параметров чем filesrc, рассмотрим наиболее важные.
location
Данный параметр аналогичен одноименному параметру элемента filesrc, за исключением того, что поддерживаются только схемы URI http, https, icy или icyx.
user-agent
Название говорит само за себя — данный параметр устанавливает, какой использовать User-Agent при отправке HTTP-запросов.
automatic-redirect
Устанавливает автоматический переход в случае, если сервер ответил, что ресурс был перемещен (статусы 301 и 302).
user-id и user-pw
Данные свойства устанавливают имя пользователя и пароль, на случай, если ресурс требует авторизации (HTTP Basic Authentication).
proxy, proxy-id и proxy-pw
Данные свойства устанавливают адрес прокси сервера, имя пользователя и пароль для авторизации (если необходимо). Поддерживаются HTTP и HTTPS прокси.
Использование источника souphttpsrc, ничем не отличается от использования источника filesrc:
gst-launch-1.0 souphttpsrc location=http://radio.localhost:1234 ! decodebin ! autoaudiosink
3. giosrc
В наборе плагинов GStreamer имеется интересный элемент giosrc. Это почти то же самое что и filesrc, только работает он через библиотеку GIO, и позволяет получать данные из различных источников с которыми может работать GIO. Таких источников 22, начиная от file, заканчивая mtp. Также, данный элемент поддерживает протоколы ftp, sftp, smb и webdav.
Данный элемент имеет параметры аналогичные элементу filesrc. Пример использования данного источника аналогичен использованию предыдущих:
gst-launch-1.0 giosrc location=ftp://ftp.localhost/foo/bar.mp3 ! decodebin ! autoaudiosink
4. rtspsrc
Как можно понять из названия, данный элемент позволяет читать данные с RTSP сервера. Подробно рассматривать свойства данного элемента не будем, скажу только то, что он имеет свойство location для указания адреса источника данных, proxy, proxy-id и proxy-pw для указания настроек прокси, и с десяток свойств специфичных для RTSP протокола, рассмотрение которого не входит в наши планы.
Но, у rtspsrc есть одна особенность, у него несколько pad-ов, и имеют они названия подходящие под шаблон source_%u. Это связано с тем, что сервер может транслировать несколько потоков одновременно, например, аудио и видео могут быть разбросаны по двум потокам.
Примечание:
Я не знаком c протоколом RTSP, поэтому я мог ошибиться в предположении выше.
Пример использования rtspsrc аналогичен предыдущим элементам:
gst-launch-1.0 rtspsrc location=rtsp://rtsp.localhost/movie.mp4 ! decodebin ! autoaudiosink
5. multifilesrc
Суть элемента multifilesrc такая же, как и у элемента filesrc — читать файлы с диска, но имеется одно отличие — multifilesrc читает файлы последовательно (1.mp3, 2.mp3. ), в то время как filesrc может читать только по одному файлу. У данного элемента есть один недостаток — имена файлов должны различаться только числом, например, file-1.mp3, file-2.mp3 и так далее. Но такой недостаток можно списать в разряд фич, так как с помощью данного «недостатка» можно с легкостью слепить из изображений 0000.png-9999.png видеоролик из фотографий, ну или мелодию из семплов, или микс из треков.
Элемент multifilesrc имеет немного параметров, и как ни странно — они все полезные. Рассмотрим их подробнее.
location
Путь к файлу может (и должен) включать в себя управляющую последовательность %d, которая будет автоматически заменена с помощью функции sprintf() на число равное текущему индексу.
Пример: /foo/bar-%04d.mp3
index, start-index и stop-index
Данные свойства содержат в себе текущий индекс, стартовый индекс, и финальный индекс. Данные свойства содержат целочисленное число.
loop
Данное свойство может содержать булево значение, и в случае если оно равно true — чтение файлов будет зациклено. Грубо говоря, это аналог функции «Repeat All».
Пример использования элемента multifilesrc который читает файлы с именами начиная от bar-1.mp3 с включенной опцией loop:
gst-launch-1.0 multifilesrc location="/foo/bar-%d.mp3" loop=true start-index=1 ! decodebin ! autoaudiosink
6. fdsrc
На мой взгляд, самый бесполезный элемент. Читает данные из файлового дескриптора. Может применяться когда лень описывать filesrc для gst-launch.
Данный элемент имеет один параметр:
fd
Данный параметр должен содержать число, равное открытому файловому дескриптору. По умолчанию равняется нулю.
cat /foo/bar.mp3 | gst-launch-1.0 fdsrc ! decodebin ! autoaudiosink
7. fakesrc
Как следует из названия, данный элемент ничего не делает — он просто является dummy-источником пустых буферов.
8. alsasrc, pulsesrc, osssrc, jackaudiosrc, autoaudiosrc
Данные элементы предназначены для получения потока с микрофонного входа звуковой карты. Из названий следует, что они используются для работы с различными звуковыми подсистемами, такими, как Alsa, PulseAudio, OSS, Jack. Элемент autoaudiosrc является «оберткой» над остальными элементами, и упрощает разработку, забирая на свои плечи всю работу по выбору источника звука.
Свойств у данных элементов не очень много. Основным свойством является device, оно присутствует в первых трех элементах и должно содержать название девайса (hw:0, hw:1. ). Остальные свойства используются специфичны для каждой звуковой подсистемы, и рассматривать мы их не будем.
9. v4l2src
Этот элемент предназначен для открытия видеопотока через интерфейс Video4Linux2. Интерфейс V4L2 поддерживает большинство веб-камер, ТВ-тюнеры, DVB-карточки и карточки видеозахвата.
Рассмотрим наиболее важные параметры:
device
Указывает имя устройства с которого нужно производить захват. Узнать список доступных устройств можно с помощью
ls -l /dev/v4l/by-id
В качестве значения этого параметра должен быть указан полный путь к устройству.
Пример: device=/dev/video0
hue, saturation, contrast. brightness
Данные параметры отвечают за цветовой баланс, насыщенность, контраст и яркость соответственно. Конечно же, если устройство видеозахвата не поддерживает данные параметры, то изображение будет таким, каким его отдает устройство. Значения этих свойств должны находиться в диапазоне от -2147483648 до 2147483647.
Пример использования элемента:
gst-launch-1.0 v4l2src ! xvimagesink
10. audiotestsrc
Этот элемент аналогичен элементу fakesrc, но отличается тем, что генерирует реальный аудиосигнал. Его можно использовать как для тестирования сложных pipeline запущенных посредством gst-launch, для тестирования работоспособности pipeline в написанном приложении, а также его можно использовать как эталонный генератор для измерения АЧХ и искажений которые вносят разнообразные фильтры.
Рассмотрим наиболее интересные параметры данного элемента.
wave
Данный параметр устанавливает форму сигнала. Доступно 13 значений: sine, square, saw, triangle, silence, white-noise, pink-noise, sine-table, ticks, gaussian-noise, red-noise, blue-noise, violet-noise.
volume
Не сложно догадаться, что этот параметр устанавливает уровень сигнала (громкость). Допустимые значения располагаются в диапазоне от 0 до 1.
freq
Это свойство устанавливает частоту сигнала, и значение может располагаться в диапазоне от 0 до 20000.
Пример использования элемента audiotestsrc:
gst-launch-1.0 audiotestsrc wave=saw freq=205 ! autoaudiosink
11. videotestsrc
Этот элемент, как и audiotestsrc, используется для генерации тестовых данных, а именно, видеопотока. Его можно использовать как для проверки работоспособности всего pipeline, или же для проверки на наличие искажений которые вносятся фильтрами.
Параметров у этого элемента очень много, рассмотрим мы только один, самый интересный на мой взгляд.
pattern
Данный параметр устанавливает шаблон видеосигнала. Допустимым значением может быть одно из 21. Полный список: smpte, snow, black, white, red, green, blue, checkers-1, checkers-2, checkers-4, checkers-8, circular, blink, smpte75, zone-plate, gamut, chroma-zone-plate, solid-color, ball, smpte100, bar.
На всех значениях останавливаться не буду, скажу только то, что значения smpte, smpte75 и smpte100 — это настроечные таблицы SMPTE которые применяются в настройках теле/видео-аппаратуры. Шаблоны checkers-* — это сетка NxN пикселей, где N равняется числу в имени шаблона. Остальные же значения устанавливают шаблон с монотонным изображением, например заливку цветом.
gst-launch-1.0 videotestsrc pattern=smpte ! xvimagesink
Пояснения
- Они узкоспециализированные;
- У меня отсутствуют необходимые «железки» для проверки того или иного плагина.
gst-inspect-1.0 filesrc
и в секции «Element Properties» вы можете наблюдать все свойства (в том числе и унаследованные).
Примеры
Сегодня мы рассмотрим один простой пример использования GStreamer. В примере я буду использовать Python 2.7, GStreamer 1.0 и GObject Introspection.
Сразу оговорюсь, код может быть не идеальным, и может быть даже так называемым «говнокодом», но его единственное назначение показать, как использовать GStreamer, не более.
Простой плеер
Данный пример показывает, как проводится связывание элементов, как обрабатываются сообщения и изменяются свойства элементов.
Код плеера
#env python2 # coding=utf-8 import gi gi.require_version("Gst", "1.0") gi.require_version("Gtk", "3.0") from gi.repository import Gst from gi.repository import Gtk from gi.repository import GObject import os import signal import argparse Gst.init("") signal.signal(signal.SIGINT, signal.SIG_DFL) GObject.threads_init() def parse_args(): parser = argparse.ArgumentParser(prog='example1.py') parser.add_argument('--volume', help='Указать громкость (0-100)', type=int, default=100) parser.add_argument('location') args = parser.parse_args() return args class Player(): def __init__(self, args): self.pipeline = self.create_pipeline(args) ## получаем шину по которой рассылаются сообщения ## и вешаем на нее обработчик message_bus = self.pipeline.get_bus() message_bus.add_signal_watch() message_bus.connect('message', self.message_handler) ## устанавливаем громкость self.pipeline.get_by_name('volume').set_property('volume', args.volume / 100.) def create_source(self, location): """create_source(str) -> Gst.Element""" if not args.location.startswith('http') and not os.path.exists(args.location): raise IOError("File %s doesn't exists" % args.location) if location.startswith('http'): source = Gst.ElementFactory.make('souphttpsrc', 'source') else: source = Gst.ElementFactory.make('filesrc', 'source') source.set_property('location', location) return source def create_pipeline(self, args): """create_pipeline() -> Gst.Pipeline""" pipeline = Gst.Pipeline() ## Создаем нужные элементы для плеера source = self.create_source(args.location) decodebin = Gst.ElementFactory.make('decodebin', 'decodebin') audioconvert = Gst.ElementFactory.make('audioconvert', 'audioconvert') volume = Gst.ElementFactory.make('volume', 'volume') audiosink = Gst.ElementFactory.make('autoaudiosink', 'autoaudiosink') ## decodebin имеет динамические pad'ы, которые так же динамически ## необходимо линковать def on_pad_added(decodebin, pad): pad.link(audioconvert.get_static_pad('sink')) decodebin.connect('pad-added', on_pad_added) ## добавляем все созданные элементы в pipeline [pipeline.add(k) for k in [source, decodebin, audioconvert, volume, audiosink]] ## линкуем элементы между собой по схеме: ## *src* -> (decodebin + audioconvert) -> volume -> autoaudiosink source.link(decodebin) audioconvert.link(volume) volume.link(audiosink) return pipeline def play(self): self.pipeline.set_state(Gst.State.PLAYING) def message_handler(self, bus, message): """Обработчик сообщений""" struct = message.get_structure() if message.type == Gst.MessageType.EOS: print('Воспроизведение окончено.') Gtk.main_quit() elif message.type == Gst.MessageType.TAG and message.parse_tag() and struct.has_field('taglist'): print('GStreamer обнаружил в потоке мета-теги') taglist = struct.get_value('taglist') for x in range(taglist.n_tags()): name = taglist.nth_tag_name(x) print(' %s: %s' % (name, taglist.get_string(name)[1])) else: pass if __name__ == "__main__": args = parse_args() player = Player(args) player.play() Gtk.main()
Примеры запуска этого скрипта:
python2 ./example1.py /foo/bar.mp3 python2 ./example1.py --volume 50 /foo/bar.mp3 python2 ./example1.py http://myradio.localhost:5678/foo.mp3
В случае, если все пойдет как нужно — вы услышите нужный вам трек и увидите список ID3 тегов, если таковые имеются.
Пример доступен на GitHub.
Ну вот и все
Сегодня мы рассмотрели около половины имеющихся источников данных которые доступны «из коробки», рассмотрели примеры запуска этих элементов, а также рассмотрели пример простого плеера основанного на GStreamer. В следующих статьях мы будем рассматривать остальные классы плагинов, рассмотрим еще больше примеров использования GStreamer, и конечно же, напишем больше кода.
До встречи через неделю!
Литература
- GStreamer Application Development Manual
- GStreamer Core Plugins Reference Manual
- GStreamer Base Plugins Reference Manual
- GStreamer Good Plugins Reference Manual
- Video4Linux
- GIO Reference Manual
- The ID3v2/Shoutcast standart
- SHOUTCast
UPD 1: Добавлены элементы audiotestsrc, videotestsrc.
GStreamer
GStreamer — это основанная на конвейере мультимедийная структура, которая связывает воедино широкий спектр систем обработки мультимедиа для выполнения сложных рабочих процессов. Например, GStreamer можно использовать для создания системы, которая считывает файлы в одном формате, обрабатывает их и экспортирует в другом. Форматы и процессы могут быть изменены в режиме plug and play.
GStreamer поддерживает широкий спектр компонентов обработки мультимедиа, включая простое воспроизведение звука, воспроизведение аудио и видео, запись , потоковую передачу и редактирование. Конструкция конвейера служит основой для создания многих типов мультимедийных приложений, таких как видеоредакторы , транскодеры , потоковые медиа-вещатели и медиаплееры .
Он разработан для работы с различными операционными системами, например, с операционными системами на основе ядра Linux , BSD , OpenSolaris , Android , macOS , iOS , Windows , OS / 400 .
- 1 Распространение и принятие
- 2 Архитектура программного обеспечения
- 2.1 языковые привязки
- 2.2 Обзор
- 2.3 Плагины
- 2.3.1 Ускорение видео
- 2.3.2 Форматы мультимедиа
- 3.1 Первые дни
- 3.2 Серия 0.10
- 3.3 Серия 1.x
Распространение и принятие [ править ]
Среда рабочего стола GNOME , интенсивно использующая GStreamer, включает GStreamer начиная с GNOME версии 2.2 и поощряет использование приложений GNOME и GTK . Другие проекты также используют или поддерживают его, например, медиа-фреймворк Phonon и медиаплеер Songbird .
GStreamer также работает во встроенных устройствах, таких как Jolla Phone , Palm Pre , [6] Tizen и Интернет-планшеты Nokia 770 , N800 , N810 , N900 и N9, работающие под управлением операционной системы Maemo .
Помимо выпусков исходного кода, проект GStreamer предоставляет двоичные сборки для Android, iOS, OSX и Windows. [7]
LIGO Воспользоваться Лаборатория GStreamer для моделирования и анализа данных гравитационных волн. Интерфейс GStreamer называется GstLAL. [8]
Архитектура программного обеспечения [ править ]
Ядро GStreamer с тремя различными типами плагинов.
GStreamer — это конвейер .GStreamer написан на языке программирования C с системой типов, основанной на GObject и объектной модели GLib 2.0.
Привязки языков [ править ]
Библиотека, написанная на одном языке программирования, может использоваться на другом языке, если написаны привязки ; GStreamer имеет ряд привязок для различных языков, таких как Python , Rust , Vala , C ++ , Perl , GNU Guile , C # и Ruby .
Обзор [ править ]
GStreamer обрабатывает мультимедиа, соединяя ряд обрабатывающих элементов в конвейер . Каждый элемент предоставляется плагином . Элементы могут быть сгруппированы в бункеры , которые затем могут быть агрегированы, образуя иерархический граф. Это пример графа фильтра .
Элементы связываются с помощью контактных площадок . Подушка источника на одном элементе может быть соединена с подушкой раковины на другом. Когда конвейер находится в состоянии воспроизведения , буферы данных перетекают от панели источника к панели приемника. Пэды согласовывают тип данных, которые будут отправлены с использованием возможностей .
На диаграмме справа может быть показан пример воспроизведения файла MP3 с помощью GStreamer. Источник файла считывает файл MP3 с жесткого диска компьютера и отправляет его в декодер MP3. Декодер декодирует данные файла и преобразует их в образцы PCM, которые затем передаются звуковому драйверу ALSA . Звуковой драйвер ALSA отправляет образцы звука PCM на динамики компьютера.
Плагины [ править ]
GStreamer использует архитектуру подключаемых модулей, которая максимально использует функциональные возможности GStreamer, реализованные в виде общих библиотек . [9] Базовая функциональность GStreamer содержит функции для регистрации и загрузки плагинов, а также для предоставления основ всех классов в форме базовых классов . Библиотеки подключаемых модулей динамически загружаются для поддержки широкого спектра кодеков , форматов контейнеров , драйверов ввода / вывода и эффектов.
Плагины можно установить полуавтоматически, когда они впервые понадобятся. Для этой цели дистрибутивы могут зарегистрировать бэкэнд, который преобразует описания функций в имена пакетов.
Начиная с версии 0.9, плагины сгруппированы в три набора (названных в честь фильма «Хороший, плохой и злой» ). [10]
Название набора плагинов Описание Хорошо Этот пакет содержит подключаемые модули GStreamer из «хорошего» набора, набора высококачественных подключаемых модулей под лицензией LGPL. [11] Плохо Плохие плагины GStreamer — это набор плагинов, не отвечающих требованиям по сравнению с остальными. Они могут близко подходить к качественным плагинам, но им чего-то не хватает: возможно, хорошего обзора кода , некоторой документации, набора тестов, реального живого сопровождающего или какого-то реального широкого использования. [12] Уродливый Этот пакет содержит подключаемые модули из «уродливого» набора, набора подключаемых модулей хорошего качества, которые могут создавать проблемы с распространением. [13] Отдельные дистрибутивы могут дополнительно подклассифицировать эти плагины: например, Ubuntu группирует «плохие» и «уродливые» наборы в компоненты «Вселенная» или «Мультивселенная» .
Также существует отдельный подключаемый модуль GStreamer FFmpeg , который представляет собой подключаемый модуль на основе FFmpeg, который поддерживает множество дополнительных медиаформатов. Впервые он был выпущен 26 февраля 2004 года с номером версии 0.7.1. [14] [15] Он может прозрачно использовать Libav , и поэтому его часто называют подключаемым модулем GStreamer Libav в последних дистрибутивах Linux.
Ускорение видео [ править ]
Через специальные плагины, предоставляемые Texas Instruments, GStreamer использует аппаратное ускорение, предоставляемое, например, Texas Instruments DaVinci .
Существуют различные блоки SIP, которые могут выполнять вычисления для декодирования определенных видеокодеков, например PureVideo , UVD , QuickSync Video , TI Ducati и других. Это должно поддерживаться драйвером устройства , который, в свою очередь, предоставляет один или несколько интерфейсов , таких как VDPAU , VAAPI , Distributed Codec Engine или DXVA, для программного обеспечения конечного пользователя, такого как MPlayer, для доступа к этому оборудованию и разгрузки вычислений на нем.
- Можно использовать механизм кодирования видео с GStreamer через подключаемый модуль- оболочку OpenMAX IL gst-omx . [16] Это возможно, например, на Raspberry Pi . [17]
- Ядро SIP присутствует на некоторых Texas Instruments SoCs также доступна через GStreamer: GST-DMAI , GST-OpenMAX , GST-дсп . [18]
- VDPAU и VAAPI поддерживаются GNOME Videos > = 2.28.0 и GStreamer> = 0.10.26 с 2010 г. [19]
- Поддерживается Broadcom Crystal HD [20]
Форматы мультимедиа [ править ]
Упомянутые ранее плагины Good, Bad и Ugly GStreamer, наряду с элементами обработки / фильтрами всех видов, поддерживают широкий спектр форматов файлов, протоколов и мультимедийных кодеков. В дополнение к ним, поддержка более сотни форматов сжатия (включая MPEG-1 , MPEG-2 , MPEG-4 , H.261 , H.263 , H.264 , RealVideo , MP3 , WMV и т. Д. [21]) [22] ) прозрачно предоставляется через подключаемый модуль GStreamer FFmpeg / libav. См. Libav и FFmpeg на страницах с полным списком медиаформатов, предоставляемых этими надстройками.
История и развитие [ править ]
Ранние дни [ править ]
Эрик Валтинсен основал проект GStreamer в 1999 году. Многие из его основных дизайнерских идей были получены в результате исследовательского проекта в Орегонском аспирантуре . [ необходима цитата ] Вим Тайманс присоединился к проекту вскоре после этого и значительно расширил многие аспекты системы. С тех пор много других разработчиков программного обеспечения внесли свой вклад.
Первым крупным выпуском была версия 0.1.0, о которой было объявлено 11 января 2001 года. [1] Вскоре после этого GStreamer приобрела своего первого коммерческого спонсора, компанию по встроенному Linux под названием RidgeRun. В конце января 2001 года они наняли Эрика Валтинсена для разработки методов встраивания GStreamer в устройства меньшего размера ( класса сотовых телефонов ). Другой сотрудник RidgeRun, Брок А. Фрейзер, разработал логотип GStreamer. Позже RidgeRun столкнулся с финансовыми трудностями, и ему пришлось уволить своих сотрудников, в том числе Эрика Валтинсена. Прогресс GStreamer практически не изменился.
Проект выпустил серию основных выпусков: 0.2.0 в июле 2001 г., 0.4.0 в сентябре 2002 г. и 0.8.0 в марте 2004 г. В течение этого периода проект также изменил свою стратегию управления версиями, и в то время как первые выпуски были просто новые версии, позже средний номер стал обозначать серию выпуска. Это означало, что проект действительно выпустил ряд выпусков 0.6.x и 0.8.x, которые должны были оставаться бинарно совместимыми в рамках этих выпусков. Эрик Валтинсен в это время более или менее оставил разработку GStreamer позади, сосредоточившись на других проектах.
Во время выпуска 0.8.x проект столкнулся с трудностями. Серия 0.8.x не пользовалась большой популярностью в сообществе Linux в основном из-за проблем со стабильностью и серьезного отсутствия функций по сравнению с конкурирующими проектами, такими как Xine , MPlayer и VLC . Проект также страдал от недостатка руководства, поскольку Вим Тайманс, руководитель проекта после ухода Эрика Валтинсена, в основном прекратил участие.
Серия 0.10 [ править ]
В 2004 году была основана новая компания Fluendo , которая хотела использовать GStreamer для написания потокового сервера Flumotion, а также предоставить мультимедийные решения для GStreamer. За это время Fluendo наняла большинство основных разработчиков, включая Вима Таймана, и заручилась поддержкой таких компаний, как Nokia и Intel, чтобы вывести GStreamer на профессиональный уровень и способствовать его принятию сообществом.
С Вимом Таймансом, снова у руля, ядро GStreamer было переработано и превратилось в текущую серию 0.10.x, первая версия которой (0.10.0) вышла в декабре 2005 года. [23] С тех пор она поддерживает API и совместимость с ABI. .
Благодаря новому стабильному ядру, GStreamer приобрел популярность в 2006 году и использовался медиаплеерами, включая Totem , Rhythmbox и Banshee, а также многие другие. Он также был принят такими корпорациями, как Nokia , Motorola , Texas Instruments , Freescale , Tandberg и Intel .
В 2007 году большинство основных разработчиков GStreamer покинули Fluendo, в том числе сопровождающий GStreamer Вим Тайманс, который вместе с другими ветеранами GStreamer стал соучредителем Collabora Multimedia , а другие присоединились к Sun Microsystems , Oblong Industries и Songbird .
В период с июня 2012 по август 2014 года, GStreamer 0,10 был также распространен Collabora и Fluendo как мультиплатформенной SDK , [24] на третьей стороне gstreamer.com сайта (а не gstreamer.freedesktop.org для проекта вверх по течению сообщества). Цель заключалась в том, чтобы предоставить разработчикам приложений SDK, который был бы функционально идентичен в Windows, Mac OS X, iOS, Android и все поддерживаемые платформы Linux. Инициатива SDK была направлена на облегчение коммерческого внедрения проекта GStreamer, поскольку он предоставил стандартизированную точку входа для разработки мультимедийных приложений с помощью GStreamer, без необходимости самостоятельно создавать всю платформу. Пользователи SDK также извлекли пользу из документации , руководств и инструкций, относящихся к этому SDK.
Серия 1.x [ править ]
GStreamer 1.0 был выпущен 24 сентября 2012 года. [25] Серия 1.x может быть установлена параллельно с GStreamer 0.10 для облегчения перехода и обеспечивает множество архитектурных преимуществ по сравнению с серией 0.10. [26] В целом GStreamer 1.0 внес значительные улучшения для:
- Поддержка встроенных процессоров, более низкое энергопотребление, передача работы специализированным аппаратным модулям (например, DSP )
- Аппаратное ускорение декодирования / кодирования видео с использованием графических процессоров
- Управление памятью с нулевым копированием (предотвращение ненужных обходов между ЦП и ГП) для повышения производительности и снижения энергопотребления
- Динамические конвейеры
- Очистка API и кода
Помимо технических улучшений, серия 1.x также определяется новой схемой управления версиями. Как объясняется в дорожной карте GStreamer [27], все версии 1.xy несут суффикс версии API -1.0 и имеют стабильный API / ABI. API / ABI может быть нарушен только в новой серии основных выпусков (например, 2.x); однако в настоящее время нет планов по выпуску серии 2.0. А пока новую схему нумерации версий можно использовать для прогнозирования предполагаемого использования каждого выпуска. В дорожной карте приводится несколько примеров:
- 1.0.0, 1.0.1, 1.0.2, 1.0.3 . стабильный выпуск и последующие выпуски с исправлениями ошибок
- 1.1.0, 1.1.1, 1.1.2, 1.1.3 . предварительные выпуски, разрабатываемая версия до 1.2.0
- 1.2.0, 1.2.1, 1.2.2, 1.2.3 . стабильный выпуск и последующие выпуски с исправлениями ошибок
- 1.3.0 .
- 1.4.0 .
- и т.п.
В марте 2013 года специалисты по сопровождению проекта GStreamer опубликовали заявление [28], поясняющее, что серия 0.10 больше не поддерживается. В заявлении подтверждается готовность проекта GStreamer помочь разработчикам приложений и плагинов перейти на новую технологию и намекнуть, что те, для кого переход на серию 1.x по-прежнему считается невозможным, могут обратиться за помощью к различным консалтинговым компаниям.
1.2 добавлена поддержка адаптивной потоковой передачи DASH , изображений JPEG2000 , видео VP9 и Daala , а также поддержка только декодирования для WebP .
Версия 1.14 была выпущена 19 марта 2018 года [29], добавив , среди прочего, поддержку WebRTC , AV1 , Nvidia NVDEC и Secure Reliable Transport .
См. Также [ править ]
- Портал бесплатного программного обеспечения с открытым исходным кодом
- Список программного обеспечения, использующего GStreamer
- Libvisual
- OggConvert — простой интерфейс с графическим интерфейсом
- SoundConverter — интерфейс с графическим интерфейсом на основе GStreamer и GTK для транскодирования цифровых аудиофайлов.
- Pitivi — видеоредактор на основе GStreamer
Ссылки [ править ]
- ^ a b «GStreamer» Slipstream «0.1.0 выпущен» . 11 января 2001 . Проверено 3 ноября 2010 года .
- ^ «Примечания к выпуску GStreamer 1.18» . Проверено 14 января 2021 года .
- ^ «Предварительный выпуск GStreamer 1.17.90 (1.18.0 RC1)» . Проверено 10 сентября 2020 .
- ^ «GStreamer», Ohloh Analysis Summary , Ohloh , получено 6 ноября 2016 г.
- ^ a b «Лицензирование ваших приложений и плагинов для использования с GStreamer» . freedesktop.org . Архивировано из оригинала на 2014-06-15 . Проверено 7 июня 2014 .
- ^ «WebOS и GStreamer» . webOShelp. Архивировано из оригинального 22 марта 2009 года . Проверено 25 июля 2009 года .
- ^ «GStreamer: Загрузить» . gstreamer.freedesktop.org . Дата обращения 15 мая 2015 .
- ^ «Страница проекта GstLAL» . Wiki.ligo.org . Дата обращения 6 мая 2019 .
- ^ Обзор модулей , Gstreamer.freedesktop.org , получено 8 февраля 2012 г.
- ^ Серия разработок GStreamer 0.9 — Hung by a Thread , Gstreamer.freedesktop.org , получено 24 февраля 2013 г.
- ^ «Хорошие плагины GStreamer» .
- ^ «Плохие плагины GStreamer» .
- ^ «Уродливые плагины GStreamer» .
- ^ Новости , Gstreamer.freedesktop.org , получено 7 февраля 2012 г.
- ^ Примечания к выпуску плагина GStreamer FFmpeg 0.7.1 «True Colors» , Gstreamer.freedesktop.org , получено 7 февраля 2012 г.
- ^ «Плагин-оболочка GStreamer OpenMAX IL» . gstreamer.freedesktop.org . Проверено 21 июля 2017 .
- ^ «Gstreamer 1.0 для raspbian» . GRaspberrypi.org . Проверено 21 июля 2017 .
- ^ «Плагины GStreamer для оборудования TI» . Processors.wiki.ti.com . Проверено 21 июля 2017 .
- ^ «Fluendo Codec Pack Release 11 обеспечивает поддержку VDPAU и VAAPI» . 2010-03-25. Архивировано из оригинала на 2014-06-24.
- ^ Веб-мастер Debian, [email protected]. «Debian — Подробная информация о пакете gstreamer0.10-crystalhd в wheezy» . Packages.debian.org . Проверено 21 июля 2017 .
- ^ Подключаемый модуль FFmpeg , Gstreamer.freedesktop.org , получено 7 февраля 2012 г.
- ^ ext / ffmpeg / gstffmpegcodecmap.c , Cgit.freedesktop.org , получено 7 февраля 2012 г.
- ^ «Стабильный выпуск GStreamer 0.10.0 — Объявление о первом выпуске в стабильной серии 0.10» . gstreamer.freedesktop.org . Проверено 21 июля 2017 .
- ^ «Документация GStreamer» . Docs.gstreamer.com . Проверено 21 июля 2017 .
- ^ «Выпущен GStreamer 1.0» . gstreamer.freedesktop.org . Проверено 21 июля 2017 .
- ^ «GStreamer 1.0 и 0.10» . Lwn.net . Проверено 21 июля 2017 .
- ^ «Архивная копия» . Архивировано из оригинала на 2013-08-15 . Проверено 16 сентября 2013 .
- CS1 maint: заархивированная копия как заголовок ( ссылка )
- ^ «GStreamer 0.10 больше не поддерживается» . Lists.freedesktop.org . Проверено 21 июля 2017 .
- ^ https://gstreamer.freedesktop.org/releases/1.14/
Внешние ссылки [ править ]
Викискладе есть медиафайлы по теме GStreamer . - Официальный веб-сайт
- Веб-сайт для GStreamer SDK
- Проект GStreamer на Ohloh
- #gstreamer подключиться к freenode
- Веб-сайт подключаемого модуля GStreamer FFmpeg
- Пакеты двоичного установщика Windows
- Пакеты двоичного установщика Mac OS X
- Delphi Bridge (привязка)
- Авахи
- Compiz
- D-автобус
- DRI
- Зачаровывать
- Flatpak
- кмскон
- люит
- модерн
- PackageKit
- Плимут
- PulseAudio
- systemd
- Wayland
- Сервер X.Org
- Гламур
- AppStream
- Каир
- Fontconfig
- GStreamer
- Меса 3D
- HarfBuzz
- Панго
- Попплер
- Swfdec
- Video Acceleration API
- XCB
- Xft
- CppUnit
- Галаго
- Открытые службы совместной работы (OCS)
- Телепатия
- Создать проект
- Портлендский проект