- Фреймворк GStreamer. Руководство разработчика приложений. Введение
- Предисловие
- Введение
- Предварительное чтение
- GStreamer: кодеки с привкусом Linux
- GStreamer — GStreamer
- СОДЕРЖАНИЕ
- Распространение и принятие
- Архитектура программного обеспечения
- Языковые привязки
- Обзор
- Плагины
- Видео ускорение
- Форматы мультимедиа
- История и развитие
- Первые дни
- Серия 0.10
- Серия 1.x
Фреймворк GStreamer. Руководство разработчика приложений. Введение
Предисловие
GStreamer является чрезвычайно мощным и гибким фреймворком для разработки приложений, обрабатывающих потоковые мультимедийные данные. Многие преимущества фреймворка GStreamer обусловлены его модульной архитектурой: GStreamer позволяет достаточно просто подключать дополнительные модули плагинов. Но платой за использование модульной архитектуры и удобных интерфейсов чаще всего является усложнение программного продукта, при этом процесс разработки новых приложений на его основе не всегда прост.
Данное руководство предназначено для того, чтобы помочь вам понять принцип работы фреймворка GStreamer (версии 1.3.2), после чего вы сможете разрабатывать свои собственные приложения на его основе. В первых частях руководства особое внимание будет уделяться процессу разработки простого аудиоплеера, причем главной целью данного процесса будет объяснение основных концепций фреймворка GStreamer. В следующих разделах будут рассматриваться более сложные темы, связанные как с проигрыванием мультимедийных данных, так и с другими формами их обработки (захват, редактирование, и.т.д.).
Введение
Для кого предназначено данное руководство
В данном руководстве фреймворк GStreamer описывается с точки зрения разработчика приложений; в нем описываются способы разработки приложений на основе фреймворка GStreamer с использованием библиотек и инструментов проекта GStreamer. Если вы ищите пояснения по поводу разработки плагинов, мы рекомендуем обратиться к Руководству разработчика плагинов «Plugin Writers Guide» .
Также советуем рассмотреть другую документацию, доступную на веб-сайте проекта GStreamer .
Предварительное чтение
Для того, чтобы понять данное руководство, вам потребуются базовые знания в области программирования с использованием языка C.
Структура данного руководства
Для того, чтобы облегчить вашу навигацию по данному руководству, оно было разделено на несколько больших частей. В каждой из частей рассматривается определенная обобщенная тема, связанная с разработкой приложений на основе фреймворка GStreamer. Части данного руководства расположены в следующем порядке:
Часть I, «О фреймворке GStreamer» содержит обзор фреймворка GStreamer, принципов и основ его архитектуры.
Часть II, «Создание приложения» содержит описание базовых приемов разработки приложений на основе фреймворка GStreamer. В конце данной части вам предоставится возможность создания своего собственного аудиоплеера на основе фреймворка GStreamer.
В Части III «Сложные концепции фреймворка GStreamer» мы перейдем к рассмотрению сложных концепций, которые позволяют фреймворку GStreamer превосходить конкурирующие программные продукты. Мы обсудим методику взаимодействия приложения и конвейера с использованием динамических параметров и интерфейсов, поговорим о многопоточном режиме работы и многопоточных конвейерах, распределении времени и таймерах (а также о синхронизации). Большая часть этих тем рассматривается не только для того, чтобы познакомить вас с API, а главным образом для того, чтобы вы обладали более глубоким пониманием причин проблем, возникающих в приложениях на основе фреймворка GStreamer, а также разбирались в концепциях этих приложений.
В следующей Части IV «Высокоуровневые интерфейсы для приложений на основе фреймворка GStreamer» мы будем заниматься API фреймворка GStreamer более высокого уровня. На самом деле вам не потребуется вся информация из предыдущих частей для понимания информации из данной части, но в любом случае вам придется разобраться с базовыми концепциями фреймворка GStreamer.
Наконец, в Части V «Приложения» вы найдете некоторую дополнительную информацию об интеграции с GNOME, KDE, OS X или Windows, некоторые советы по отладке приложений, а также общие советы по совершенствованию и упрощению процесса программирования с использованием фреймворка GStreamer.
Источник
GStreamer: кодеки с привкусом Linux
Вы когда-нибудь задумывались о том как работают Gnome-плееры, такие как Totem, Rhythmbox или Banshee? Наверное каждый из вас в новоустановленной Ubuntu, при попытке проиграть AVI-шку видел сообщение о необходимости установить дополнительный пакет gst-ffmpeg или gst-plugins-ugly. Под катом — моя попытка прояснить свет на то, как работает этот мультимедийный фреймворк и на что он способен.
Основное отличие от VLC или FFmpeg в том, что первоначально среда разрабатывалась не для определённого приложения, а для всех программ, которые могут работать с мультимедиа. Данный фреймворк интегрирован в такие языки: С, С++/Qt, Python, Ruby, Perl.
GStreamer позволяет создавать приложения, которые способны:
- Принимать и передавать аудио-видео, используя практически любой протокол: HTTP, RTSP/RTP, MMS, RTMP и другие.
- Разбирать/Собирать потоки в разных форматах: MPEG,AVI,ASF,FLV,MKV и другие.
- Вытягивать и вставлять метаданные в файлах.
- Декодировать/Кодировать потоки практически в любой комбиации кодеков.
При этом можно использовать не только open-source решения (libavcodec, libmp3lame, libfaac), но и проприетарные, которые можно купить. Так-же можно задействовать декодеры с аппаратной поддержкой c использованием технологий CUDA/VAAPI/CrystalHD. - Выводить потоки на экран или звуковую карту, используя самые разнообразные решения, начиная от DirectFB, и заканчивая X-ами.
Для решения таких задач, как перекодирование фильма в другой формат, большую популярность имеют такие программы как mencoder или VLC. Но сделать то-же самое при помощи GStreamer — не на много сложнее.
Ниже представлены примеры для Linux, демонстрирующие возможности фреймворка. В этих примерах мы будем использовать основные программы gst-launch и gst-inspect — чем-то напоминающие Windows-приложение GraphEdit. Для тех, кому нужна графическая оболочка — есть gst-editor. Но учтите, что эти программы предназначены для отладки, поэтому не ожидайте от них удобства в использовании.
Для начала работы с GStreamer необходимо уяснить некоторые понятия:
- element — Элемент-объект GStreamer’а, который может принимать/отправлять данные.
- source — Генерирует поток (файл, поток или устройство).
- filter — Элемент, который трансформирует поток (парсеры, мультиплексоры, кодеки).
- sink — Принимает поток и не перенаправляет его.
- pipeline — Коллекция соединённых между собой элементов.
В классическом виде мы получаем такого вида цепочку: source -> parser -> decoder -> filter -> sink.
Если вам лень собирать всю цепочку кодеков и мультиплексоров вручную, GStreamer может сделать это за вас:
Элемент «playbin» сам разбирает файл, находит нужный кодек и элемент вывода. Всё что нужно — указать путь к файлу, который нужно проиграть. Если-же вам интересно какой элемент за что отвечает, вы можете запустить gst-inspect и увидеть все доступные элементы, а «gst-inspect lame» — покажет парамерты mp3-кодера. Так-же стоит отметить полезность элемента «decodebin2», который сам находит нужный декодер.
$ gst-launch filesrc location=audio.mp3 ! decodebin2 ! alsasink
Простейший аудиоплеер (выбираем кодек вручную, и согласовываем форматы):
$ gst-launch filesrc location=audio.mp3 ! mad ! audioconvert ! audioresample ! alsasink
Плеер посложнее (со звуком и видео):
$ gst-launch filesrc location=audovideofile.mpeg ! decodebin2 name=decoder \
decoder. ! ffmpegcolorspace ! xvimagesink \
decoder. ! audioconvert ! audioresample ! alsasink
Если вам нужно перекодировать AVI-файл в MOV, можно воспользоваться следующей командой:
Хочется сделать вещание, одновременно с записью в файл и отображением на экране вещаемого видео? Без проблем:
$ gst-launch v4l2src ! queue ! \
ffmpegcolorspace ! tee name=t1 ! \
queue ! xvimagesink sync=false t1. ! \
queue ! theoraenc quality=1 ! \
queue ! oggmux name=mux \
alsasrc ! audio/x-raw-int,rate=8000,channels=1,depth=8 ! \
queue ! audioconvert ! vorbisenc ! \
queue ! mux. mux. ! \
queue ! tee name= t ! \
queue ! filesink location=test.ogg t. ! \
queue ! shout2send ip= port=8000 password=hackme
Любители повещать во флеше — тоже не остались в стороне, благодаря librtmp (надо пересобрать пакет gst-plugins-bad):
$ gst-launch v4l2src ! \
queue ! ffmpegcolorspace ! ffenc_flv ! \
queue ! flvmux name=muux is-live=true ! \
rtmpsink location=’rtmp://localhost/path/to/stream live=1′ \
alsasrc ! audio/x-raw-int,rate=22050,channels=1,depth=16 ! \
queue ! audioconvert ! lame bitrate=48 ! \
queue ! muux.
Так-же разработчики позаботились об использовании «родных» мультимедийных фреймворков (QuickTime/DirectShow), если вы используете MacOS или Windows, благодаря «мостам».
Ну и в заключение хочется сказать, что есть немало проблем, которые ещё предстоит решить разработчикам (рассинхронизации, проблемы с утечками памяти и производительности). Большинство из них связано с использованием сторонних библиотек, которые не всегда качественно написаны. Вот поэтому разработчики и придумали интересный приём — плагины разделены на 5 категорий:
- gst-plugins-base — Основные плагины, идущие в комплекте: CDDA, RTP, RTSP, ogg, theora, vorbis, Xvideo, V4L.
- gst-plugins-good — Плагины, не вызываюшие сомнения в своей надёжности: FLAC, speex, JPEG, PNG.
- gst-plugins-bad — Рабчие, но возможны проблемы: VP8, XVID, FAAC, dirac, RTMP, VDPAU, DirectShow.
- gst-plugins-ugly — Не обойтись без проблем при использовании: ASF, real, DVDSub, a52, AMR, x264.
- gst-ffmpeg — Отдельный набор кодеков «всё в одном».
Источник
GStreamer — GStreamer
GStreamer — это основанная на конвейере мультимедийная структура, которая связывает воедино широкий спектр систем обработки мультимедиа для выполнения сложных рабочих процессов. Например, GStreamer можно использовать для создания системы, которая считывает файлы в одном формате, обрабатывает их и экспортирует в другом. Форматы и процессы могут быть изменены в режиме plug and play.
GStreamer поддерживает широкий спектр компонентов обработки мультимедиа, включая простое воспроизведение звука, воспроизведение аудио и видео, запись , потоковую передачу и редактирование. Конструкция конвейера служит основой для создания многих типов мультимедийных приложений, таких как видеоредакторы , транскодеры , вещательные компании потокового мультимедиа и медиаплееры .
Он разработан для работы с различными операционными системами, например, с операционными системами на основе ядра Linux , BSD , OpenSolaris , Android , macOS , iOS , Windows , OS / 400 .
СОДЕРЖАНИЕ
Распространение и принятие
Среда рабочего стола GNOME , интенсивно использующая GStreamer, включает GStreamer начиная с GNOME версии 2.2 и поощряет использование приложений GNOME и GTK . Другие проекты также используют или поддерживают его, например, медиа-фреймворк Phonon и медиаплеер Songbird . Он также используется в движке браузера Webkit.
GStreamer также работает во встроенных устройствах, таких как Jolla Phone , Palm Pre , Tizen и Интернет-планшеты Nokia 770 , N800 , N810 , N900 и N9, работающие под управлением операционной системы Maemo .
Помимо выпусков исходного кода, проект GStreamer предоставляет двоичные сборки для Android, iOS, OSX и Windows.
LIGO Воспользоваться Лаборатория GStreamer для моделирования и анализа данных гравитационных волн. Интерфейс GStreamer называется GstLAL.
Архитектура программного обеспечения
GStreamer написан на языке программирования C с системой типов, основанной на GObject и объектной модели GLib 2.0.
Языковые привязки
Библиотека, написанная на одном языке программирования, может использоваться на другом языке, если написаны привязки ; GStreamer имеет ряд привязок для различных языков, таких как Go , Python , Rust , Vala , C ++ , Perl , GNU Guile , C # и Ruby .
Обзор
GStreamer обрабатывает мультимедиа, соединяя ряд обрабатывающих элементов в конвейер . Каждый элемент предоставляется плагином . Элементы могут быть сгруппированы в бункеры , которые затем могут быть агрегированы, образуя иерархический граф. Это пример графа фильтра .
Элементы связываются с помощью контактных площадок . Подушка источника на одном элементе может быть соединена с подушкой раковины на другом. Когда конвейер находится в состоянии воспроизведения , буферы данных перетекают от панели источника к панели приемника. Пэды согласовывают тип данных, которые будут отправлены с использованием возможностей .
На диаграмме справа может быть показан пример воспроизведения файла MP3 с помощью GStreamer. Источник файла считывает файл MP3 с жесткого диска компьютера и отправляет его в декодер MP3. Декодер декодирует данные файла и преобразует их в образцы PCM, которые затем передаются звуковому драйверу ALSA . Звуковой драйвер ALSA отправляет образцы звука PCM на динамики компьютера.
Плагины
GStreamer использует архитектуру подключаемых модулей, которая максимально использует функциональные возможности GStreamer, реализованные в виде общих библиотек . Базовая функциональность GStreamer содержит функции для регистрации и загрузки подключаемых модулей, а также для предоставления основ всех классов в форме базовых классов . Библиотеки подключаемых модулей динамически загружаются для поддержки широкого спектра кодеков , форматов контейнеров , драйверов ввода / вывода и эффектов.
Плагины можно установить полуавтоматически, когда они впервые понадобятся. Для этой цели дистрибутивы могут зарегистрировать бэкэнд, который преобразует описания функций в имена пакетов.
Начиная с версии 0.9, плагины сгруппированы в три набора (названных в честь фильма «Хороший, плохой и злой» ).
Название набора плагинов | Описание |
---|---|
Хороший | Этот пакет содержит подключаемые модули GStreamer из «хорошего» набора, набора высококачественных подключаемых модулей под лицензией LGPL. |
Плохой | Плохие плагины GStreamer — это набор плагинов, не отвечающих требованиям по сравнению с остальными. Они могут близко подходить к качественным плагинам, но им чего-то не хватает: возможно, хорошего обзора кода , некоторой документации, набора тестов, реального живого сопровождающего или какого-то реального широкого использования. |
Уродливый | Этот пакет содержит подключаемые модули из «уродливого» набора, набора подключаемых модулей хорошего качества, которые могут создавать проблемы с распространением. |
Отдельные дистрибутивы могут дополнительно подклассифицировать эти плагины: например, Ubuntu группирует «плохие» и «уродливые» наборы в компоненты «Вселенная» или «Мультивселенная» .
Также существует отдельный подключаемый модуль GStreamer FFmpeg , который представляет собой подключаемый модуль на основе FFmpeg, который поддерживает множество дополнительных медиаформатов. Впервые он был выпущен 26 февраля 2004 года с номером версии 0.7.1. Он может прозрачно использовать Libav , и поэтому его часто называют подключаемым модулем GStreamer Libav в последних дистрибутивах Linux.
Видео ускорение
Существуют различные блоки SIP, которые могут выполнять вычисления для декодирования определенных видеокодеков, например PureVideo , UVD , QuickSync Video , TI Ducati и других. Это должно поддерживаться драйвером устройства , который, в свою очередь, предоставляет один или несколько интерфейсов , таких как VDPAU , VAAPI , Distributed Codec Engine или DXVA, для программного обеспечения конечного пользователя, такого как MPlayer, для доступа к этому оборудованию и разгрузки вычислений на нем.
- Можно использовать механизм кодирования видео с GStreamer через подключаемый модуль- оболочку OpenMAX IL gst-omx . Это возможно, например, на Raspberry Pi .
- Ядро SIP присутствует на некоторых Texas Instruments SoCs также доступна через GStreamer: GST-DMAI , GST-OpenMAX , GST-дсп .
- VDPAU и VAAPI поддерживаются GNOME Videos > = 2.28.0 и GStreamer> = 0.10.26 с 2010 г.
- Broadcom Crystal HD поддерживается
Форматы мультимедиа
Упомянутые ранее плагины Good, Bad и Ugly GStreamer, наряду с элементами обработки / фильтрами всех видов, поддерживают широкий спектр форматов файлов, протоколов и мультимедийных кодеков. В дополнение к этому, прозрачно поддерживается более сотни форматов сжатия (включая MPEG-1 , MPEG-2 , MPEG-4 , H.261 , H.263 , H.264 , RealVideo , MP3 , WMV и т. Д.) предоставляется через подключаемый модуль GStreamer FFmpeg / libav. См. Страницы Libav и FFmpeg для получения полного списка форматов мультимедиа, предоставляемых этими надстройками.
История и развитие
Первые дни
Эрик Валтинсен основал проект GStreamer в 1999 году. Многие из его основных дизайнерских идей были получены в результате исследовательского проекта в Орегонском аспирантуре . Вскоре после этого к проекту присоединился Вим Тайманс, который значительно расширил многие аспекты системы. С тех пор много других разработчиков программного обеспечения внесли свой вклад.
Первым крупным выпуском была версия 0.1.0, о которой было объявлено 11 января 2001 года. Вскоре после этого 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 года. С тех пор она поддерживает совместимость с 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 на стороннем веб-сайте 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 года. Серия 1.x может быть установлена параллельно с GStreamer 0.10 для облегчения перехода и обеспечивает множество архитектурных преимуществ по сравнению с серией 0.10. Вообще говоря, GStreamer 1.0 внес значительные улучшения для:
- Поддержка встроенных процессоров, более низкое энергопотребление, передача работы специализированным аппаратным модулям (например, DSP )
- Аппаратное ускорение декодирования / кодирования видео с использованием графических процессоров
- Управление памятью с нулевым копированием (предотвращение ненужных обходов между процессором и графическим процессором) для повышения производительности и снижения энергопотребления
- Динамические конвейеры
- Очистка API и кода
Помимо технических улучшений, серия 1.x также определяется новой схемой управления версиями. Как объясняется в дорожной карте GStreamer, все версии 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 выпустили заявление, в котором поясняют, что серия 0.10 больше не поддерживается. В заявлении подтверждается готовность проекта GStreamer помочь разработчикам приложений и плагинов перейти на новую технологию и намекнуть, что те, для кого переход на серию 1.x все еще считается невозможным, могут обратиться за помощью к различным консалтинговым компаниям.
1.2 добавлена поддержка адаптивной потоковой передачи DASH , изображений JPEG2000 , видео VP9 и Daala , а также поддержка только декодирования для WebP .
Версия 1.14 была выпущена 19 марта 2018 года, в нее , помимо других изменений , добавлена поддержка WebRTC , AV1 , Nvidia NVDEC и Secure Reliable Transport .
Источник