Типы элементов в GStreamer: source, filter, sink
В GStreamer вся обработка медиапотоков строится из небольших модульных компонентов — элементов. Каждый элемент выполняет конкретную задачу: получает данные, преобразует их или отправляет куда-то дальше. Чтобы понимать, как устроен пайплайн (цепочка обработки), важно чётко представлять, какие роли могут играть эти элементы.
Условно все элементы можно разделить на три основные категории: источники (source), преобразователи (filter / transform) и приёмники (sink). Эта классификация помогает визуализировать поток данных — от начала до конца, как по водопроводной трубе.
Источники (source): откуда берутся данные
Источник (source) — это элемент, который генерирует медиаданные и отправляет их дальше по пайплайну. У него есть только выходной пэд (src pad), потому что он ничего не принимает — только производит.
Примеры источников:
rtspsrc— получает поток по протоколу RTSP (например, с IP-камеры).v4l2src— читает видео с веб-камеры в Linux через интерфейс Video4Linux.filesrc— читает медиафайл с диска.audiotestsrc— генерирует тестовый звуковой сигнал (например, синусоиду).videotestsrc— генерирует тестовое видео (движущийся шарик, шум и т.п.).
Особенности нейминга: почему uridecodebin — это source?
На первый взгляд, название uridecodebin не похоже на источник. Но на самом деле это специальный тип элемента, который объединяет в себе:
- источник (загружает данные по URI:
file:///video.mp4,rtsp://cam.local/stream); - автоматический декодер (распаковывает поток, определяя кодек и структуру).
Такой элемент удобен, потому что вместо нескольких звеньев:
filesrc → qtdemux → h264parse → avdec_h264
можно написать просто:
uridecodebin uri=file:///video.mp4
GStreamer сам «разберётся», что делать.
🔍 Совет: не пытайтесь сразу понять, что внутри
uridecodebin. Относитесь к нему как к чёрному ящику, который «умеет брать любой URI и выдавать декодированные кадры». Подробности реализации можно изучить позже черезgst-inspect.
Преобразователи (filter / transform): что происходит с данными
Преобразователи — это элементы, которые принимают данные, обрабатывают их и отправляют дальше. У них есть как входной пэд (sink pad), так и выходной (src pad).
Они не генерируют и не потребляют поток полностью — просто «проходят» через них, изменяя форму или содержание.
Основные виды преобразований:
| Тип задачи | Пример элемента | Что делает |
|---|---|---|
| Декодирование | decodebin, avdec_h264 | Распаковывает сжатые данные (H.264, AAC и т.д.) |
| Перекодирование цвета | videoconvert | Конвертирует формат пикселей (например, из YUV в RGB) |
| Масштабирование | videoscale | Изменяет разрешение видео |
| Регулировка звука | volume | Увеличивает или уменьшает громкость |
| Фильтрация формата | capsfilter | «Фильтрует» поток по заданным характеристикам (размер, FPS и т.п.) |
| Снятие обёрток | rtph264depay, h264parse | Убирает RTP-обёртку, подготавливает данные для декодера |
Пример: как работает цепочка преобразований
Представим, что мы получили H.264-видео по RTSP. Оно приходит в виде RTP-пакетов. Чтобы увидеть изображение, нужно:
- Снять RTP-обёртку →
rtph264depay - Подготовить поток для декодера →
h264parse - Распаковать видео →
avdec_h264 - Преобразовать цвет →
videoconvert(например, из YUV в RGB) - Изменить размер →
videoscale(если нужно)
Каждый из этих шагов — отдельный элемент-преобразователь.
💡 Важно: GStreamer автоматически подбирает подходящие элементы, если вы используете
decodebin. Но при ручной сборке пайплайна вы получаете полный контроль — и возможность настроить каждый этап.
Приёмники (sink): куда уходят данные
Приёмник (sink) — это элемент, который принимает медиапоток и ничего не отправляет дальше. У него только входной пэд (sink pad). Это — конечная точка пайплайна.
Примеры приёмников:
| Элемент | Назначение |
|---|---|
autovideosink | Автоматически выбирает способ вывода видео (в окно, на экран) |
ximagesink | Выводит видео в окно X11 (Linux) |
appsink | Передаёт кадры в ваше приложение (например, в Python для OpenCV) |
rtspclientsink | Отправляет поток по RTSP на сервер |
udpsink | Передаёт данные по UDP (например, в видеоплеер или другой сервис) |
filesink | Записывает поток в файл |
Особенности некоторых sink’ов:
autovideosink— «умный» элемент: он сам решает, какой конкретный sink использовать (ximagesink,waylandsink,glimagesinkи т.д.) в зависимости от системы.appsink— ключевой элемент для интеграции с кодом. Он позволяет «вытащить» кадры из пайплайна и обработать их в Python, C++ и т.д.rtspclientsink— не просто передаёт данные, а организует полноценный RTSP-клиент, который может подключаться к серверу и отправлять поток.
⚠️ Предупреждение: если в пайплайне нет sink’а, поток «никуда не денется» — и GStreamer не запустится. Всегда проверяйте, что в конце цепочки есть приёмник.
Визуализация: как это выглядит в голове
Представьте, что вы строите водопроводную систему:
- Source — это насос или резервуар: откуда течёт вода.
- Filter/Transform — это фильтры, насосы, смесители: они изменяют давление, температуру, чистоту.
- Sink — это кран или бак: куда вода попадает в конечной точке.
В GStreamer:
rtspsrc → rtph264depay → h264parse → avdec_h264 → videoconvert → autovideosink
↑ ↑ ↑ ↑ ↑ ↑
source transform transform transform transform sink
Каждый элемент — как отдельный модуль, соединённый шлангами (пэдами). Вода (медиапоток) течёт от начала к концу.
Как работать с элементами на практике
-
Не пытайтесь запомнить все элементы — их сотни. Вместо этого:
- Используйте
gst-inspect-1.0 имя_элемента, чтобы посмотреть, что он делает, какие параметры и пэды у него есть. - Например:
gst-inspect-1.0 uridecodebinпокажет, что он принимает URI и выдаёт декодированные потоки.
- Используйте
-
Относитесь к элементам как к чёрным ящикам:
- Вы не обязаны знать, как работает
avdec_h264внутри. - Важно понимать: что на входе, что на выходе, и как его настроить.
- Вы не обязаны знать, как работает
-
Используйте стандартные шаблоны:
- Для RTSP:
rtspsrc → decodebin → videoconvert → sink - Для записи:
source → encoder → muxer → filesink - Для вывода в приложение:
... → appsink
- Для RTSP:
Итог: карта ролей элементов
| Роль | Направление потока | Примеры | Особенности |
|---|---|---|---|
| Source | → (только выход) | rtspsrc, v4l2src, filesrc | Начало пайплайна |
| Transform | ←→ (вход и выход) | videoconvert, volume, decodebin | Обработка данных |
| Sink | ← (только вход) | autovideosink, udpsink, appsink | Конец пайплайна |
Понимание этих трёх ролей — ключ к тому, чтобы читать и конструировать пайплайны, а не просто копировать команды. Когда вы видите gst-launch-1.0 ..., вы уже сможете «разобрать» его на части и понять, что происходит на каждом этапе.
📌 Следующий шаг: в следующем разделе мы разберём, как элементы «договариваются» о формате данных с помощью caps (capabilities) — это завершит картину «жизни» медиапотока в GStreamer.