GStreamer — это конвейерная мультимедийная структура , которая связывает воедино широкий спектр систем обработки мультимедиа для выполнения сложных рабочих процессов. Например, GStreamer можно использовать для создания системы, которая считывает файлы в одном формате, обрабатывает их и экспортирует в другом. Форматы и процессы можно изменять в режиме plug and play.
GStreamer поддерживает широкий спектр компонентов обработки медиа, включая простое воспроизведение аудио , воспроизведение аудио и видео, запись , потоковую передачу и редактирование. Конструкция конвейера служит основой для создания многих типов мультимедийных приложений, таких как видеоредакторы , транскодеры , вещатели потокового мультимедиа и медиаплееры .
Он предназначен для работы на различных операционных системах, например, BSD , OpenSolaris , Linux , Android , macOS , iOS , Windows , OS/400 .
GStreamer — это бесплатное программное обеспечение с открытым исходным кодом, подпадающее под условия LGPL-2.1 или более поздней версии [4] и размещаемое на freedesktop.org .
Среда рабочего стола GNOME , активно использующая GStreamer, включила GStreamer с версии GNOME 2.2 и поощряет использование его приложениями GNOME и GTK . Другие проекты также используют или поддерживают его, например, медиа-фреймворк Phonon и медиа-плеер Songbird . Он также используется в браузерном движке WebKit . [5]
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 написан на языке программирования C с системой типов, основанной на GObject и объектной модели GLib 2.0.
Библиотека, написанная на одном языке программирования, может использоваться на другом языке, если написаны привязки ; GStreamer имеет ряд привязок для различных языков, таких как Go , Python , Rust , Vala , C++ , Perl , GNU Guile , C# и Ruby .
GStreamer обрабатывает медиа, соединяя ряд обрабатывающих элементов в конвейер . Каждый элемент предоставляется плагином . Элементы могут быть сгруппированы в ячейки , которые могут быть дополнительно агрегированы, таким образом формируя иерархический граф. Это пример графа фильтра .
Элементы взаимодействуют посредством площадок . Исходная площадка на одном элементе может быть подключена к приемной площадке на другом. Когда конвейер находится в состоянии воспроизведения , буферы данных перетекают из исходной площадки в приемную площадку. Площадки согласовывают тип данных, которые будут отправлены с использованием возможностей .
Диаграмма справа может служить примером воспроизведения файла MP3 с использованием GStreamer. Источник файла считывает файл MP3 с жесткого диска компьютера и отправляет его в декодер MP3. Декодер декодирует данные файла и преобразует их в сэмплы PCM , которые затем передаются в звуковой драйвер. Звуковой драйвер отправляет звуковые сэмплы PCM на динамики компьютера.
GStreamer использует архитектуру плагинов , которая максимально использует функциональность GStreamer, реализованную в виде общих библиотек . [9] Базовая функциональность GStreamer содержит функции для регистрации и загрузки плагинов и для предоставления основ всех классов в форме базовых классов . Библиотеки плагинов динамически загружаются для поддержки широкого спектра кодеков , форматов контейнеров , драйверов ввода/вывода и эффектов.
Плагины могут быть установлены полуавтоматически, когда они впервые понадобятся. Для этой цели дистрибутивы могут зарегистрировать бэкэнд, который преобразует описания функций в имена пакетов.
Начиная с версии 0.9, плагины сгруппированы в три набора (названные в честь фильма « Хороший, плохой, злой »). [10]
Отдельные дистрибутивы могут дополнительно подразделять эти плагины: например, Ubuntu группирует «плохие» и «уродливые» наборы в компоненты «Вселенная» или «Мультивселенная» .
Кроме того, существует плагин GStreamer FFmpeg (называемый gst-libav по историческим причинам [14] ), который расширяет количество поддерживаемых медиаформатов.
Существуют различные блоки SIP , которые могут выполнять вычисления для декодирования определенных видеокодеков, таких как PureVideo , UVD , QuickSync Video , TI Ducati и др. Они должны поддерживаться драйвером устройства , который, в свою очередь, предоставляет один или несколько интерфейсов , таких как VDPAU , VAAPI , Distributed Codec Engine или DXVA, для программного обеспечения конечного пользователя, такого как MPlayer, для доступа к этому оборудованию и передачи ему вычислений.
Плагины Good, Bad и Ugly GStreamer, упомянутые ранее, наряду с элементами обработки/фильтрами всех видов, поддерживают широкий спектр форматов файлов, протоколов и кодеков мультимедиа. В дополнение к ним, поддержка более сотни форматов сжатия (включая MPEG-1 , MPEG-2 , MPEG-4 , H.261 , H.263 , H.264 , RealVideo , MP3 , WMV и т. д. [20] ) прозрачно предоставляется через плагин gst-libav .
Эрик Валтинсен основал проект GStreamer в 1999 году. Многие из его основных идей дизайна пришли из исследовательского проекта в Институте аспирантуры Орегона . [21] Вскоре после этого к проекту присоединился Вим Тайманс и значительно расширил многие аспекты системы. С тех пор внесли свой вклад многие другие разработчики программного обеспечения.
Первым крупным релизом был 0.1.0, о котором было объявлено 11 января 2001 года. [1] Вскоре после этого GStreamer нашёл своего первого коммерческого спонсора. К концу января 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 позади в это время, сосредоточившись на других начинаниях.
Все серии релизов, проект сталкивается с трудностями. Каждая серия не очень популярна в сообществе Linux в основном из-за проблем со стабильностью и серьезного недостатка функций по сравнению с конкурирующими проектами, такими как Xine , MPlayer и VLC . Проект также страдает от отсутствия руководства, поскольку Вим Тайманс, руководитель проекта после ухода Эрика Валтинсена, в значительной степени прекратил участие.
В 2004 году была основана новая компания Fluendo, которая хотела использовать GStreamer для написания потокового сервера Flumotion, а также предоставить мультимедийные решения для GStreamer. В это время Fluendo наняла большинство основных разработчиков, включая Вима Тайманса, и привлекла поддержку таких компаний, как Nokia и Intel, чтобы вывести GStreamer на профессиональный уровень и способствовать принятию его сообществом.
С возвращением Вима Тайманса у руля ядро GStreamer было переработано и стало тем, что является текущей серией 0.10.x, первый релиз которой (0.10.0) состоялся в декабре 2005 года. [22] С тех пор он поддерживает совместимость с API и ABI .
С новым стабильным ядром GStreamer приобрел популярность в 2006 году, его использовали такие медиаплееры, как Totem , Rhythmbox и Banshee , а затем и многие другие. Его также приняли такие корпорации, как Nokia , Motorola , Texas Instruments , Freescale , Tandberg и Intel .
В 2007 году большинство основных разработчиков GStreamer покинули Fluendo, включая специалиста по поддержке GStreamer Вима Тайманса, который впоследствии стал соучредителем Collabora Multimedia вместе с другими ветеранами GStreamer, в то время как другие присоединились к Sun Microsystems , Oblong Industries и Songbird .
В период с июня 2012 года по август 2014 года GStreamer 0.10 также распространялся Collabora и Fluendo как многоплатформенный SDK [23] на стороннем веб-сайте gstreamer.com (а не gstreamer.freedesktop.org для проекта upstream community). Цель состояла в том, чтобы предоставить разработчикам приложений SDK, который был бы функционально идентичен для Windows, Mac OS X , iOS и Android. Инициатива SDK была направлена на содействие коммерческому принятию проекта GStreamer, поскольку он предоставлял стандартизированную точку входа для разработки мультимедийных приложений с GStreamer, без необходимости самостоятельной сборки всей платформы. Пользователи SDK также получили выгоду от документации, архивированной 16.06.2012 на Wayback Machine , учебных пособий и инструкций, относящихся к этому SDK.
GStreamer 1.0 был выпущен 24 сентября 2012 года. [24] Серия 1.x устанавливается параллельно с GStreamer 0.10, что упрощает переход, и обеспечивает множество архитектурных преимуществ по сравнению с серией 0.10. [25] В целом, GStreamer 1.0 принес значительные улучшения для:
Помимо технических улучшений, серия 1.x также определяется новой схемой нумерации версий релизов. Как поясняет дорожная карта GStreamer, [26] все версии 1.xy имеют суффикс версии API -1.0 и стабильный API/ABI. API/ABI может быть нарушен только новой основной серией релизов (например, 2.x); однако в настоящее время нет планов на серию релизов 2.0. До тех пор новая схема нумерации версий может использоваться для прогнозирования предполагаемого использования каждого релиза. Дорожная карта приводит несколько примеров:
В марте 2013 года разработчики проекта GStreamer опубликовали заявление [27] , в котором разъяснили, что серия 0.10 больше не поддерживается. В заявлении была подтверждена готовность проекта GStreamer помочь разработчикам приложений и плагинов перейти на новую технологию, а также намекнулось, что те, для кого переход на серию 1.x все еще считается невозможным, могут обратиться за помощью в различные консалтинговые компании.
1.2 добавлена поддержка адаптивной потоковой передачи DASH , изображений JPEG 2000 , видео VP9 и Daala , а также поддержка только декодирования для WebP .
Версия 1.14 была выпущена 19 марта 2018 года [28], добавив поддержку WebRTC , AV1 , Nvidia NVDEC и Secure Reliable Transport , а также другие изменения.
Версия 1.22 была выпущена 23 января 2023 года [29] , добавив улучшенную поддержку AV1 , а также поддержку HLS , DASH и Microsoft Smooth Streaming для потоковой передачи с адаптивным битрейтом.