Перейти к основному содержимому

Типы элементов в 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-пакетов. Чтобы увидеть изображение, нужно:

  1. Снять RTP-обёрткуrtph264depay
  2. Подготовить поток для декодераh264parse
  3. Распаковать видеоavdec_h264
  4. Преобразовать цветvideoconvert (например, из YUV в RGB)
  5. Изменить размер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

Каждый элемент — как отдельный модуль, соединённый шлангами (пэдами). Вода (медиапоток) течёт от начала к концу.


Как работать с элементами на практике

  1. Не пытайтесь запомнить все элементы — их сотни. Вместо этого:

    • Используйте gst-inspect-1.0 имя_элемента, чтобы посмотреть, что он делает, какие параметры и пэды у него есть.
    • Например: gst-inspect-1.0 uridecodebin покажет, что он принимает URI и выдаёт декодированные потоки.
  2. Относитесь к элементам как к чёрным ящикам:

    • Вы не обязаны знать, как работает avdec_h264 внутри.
    • Важно понимать: что на входе, что на выходе, и как его настроить.
  3. Используйте стандартные шаблоны:

    • Для RTSP: rtspsrc → decodebin → videoconvert → sink
    • Для записи: source → encoder → muxer → filesink
    • Для вывода в приложение: ... → appsink

Итог: карта ролей элементов

РольНаправление потокаПримерыОсобенности
Source→ (только выход)rtspsrc, v4l2src, filesrcНачало пайплайна
Transform←→ (вход и выход)videoconvert, volume, decodebinОбработка данных
Sink← (только вход)autovideosink, udpsink, appsinkКонец пайплайна

Понимание этих трёх ролей — ключ к тому, чтобы читать и конструировать пайплайны, а не просто копировать команды. Когда вы видите gst-launch-1.0 ..., вы уже сможете «разобрать» его на части и понять, что происходит на каждом этапе.

📌 Следующий шаг: в следующем разделе мы разберём, как элементы «договариваются» о формате данных с помощью caps (capabilities) — это завершит картину «жизни» медиапотока в GStreamer.