07-03-02 Первый живой пример: камера, экран — окно
Теперь, когда мы познакомились с архитектурой GStreamer и поняли, что пайплайн — это цепочка соединённых элементов, пришло время запустить первые реальные, живые примеры. Цель этого раздела — отработать базовый шаблон работы с видео в GStreamer:
источник (source) → преобразование (convert) → приёмник (sink)
Этот паттерн встречается повсеместно: от тестового генератора изображений до настоящих IP-камер. Мы начнём с простых команд, которые можно запустить на любом Linux-компьютере, и увидим, как GStreamer буквально «оживает» — начнёт показывать видео в окне.
Базовая структура пайплайна: source → convert → sink
Прежде чем переходить к конкретным примерам, важно понять, зачем нужна каждая часть этой трёхзвенной цепочки.
source— элемент, который поставляет медиаданные: это может быть камера, файл, тестовый генератор или поток по сети.videoconvert— универсальный преобразователь форматов. Он не делает сложной обработки, но критически важен: он приводит видео к формату, понятному следующему элементу. Без него часто возникают ошибки совместимости.sink— элемент, который принимает видео и отображает, сохраняет или передаёт дальше. В наших примерах это будет окно на экране.
💡 Почему
videoconvertпочти всегда нужен?
Даже если формат видео уже подходящий, разные элементы могут ожидать разные внутренние представления (например,I420,RGB,NV12).videoconvertрешает эту проблему автоматически, как «переходник» между блоками.
Пример 1: Видео с веб-камеры (Linux, V4L2)
Если у вас подключена веб-камера (или встроена в ноутбук), вы можете сразу увидеть её изображение:
gst-launch-1.0 v4l2src ! videoconvert ! autovideosink
Разбор команды:
| Элемент | Роль | Пояснение |
|---|---|---|
v4l2src | source | Источник видео с камеры через интерфейс Video4Linux2 (стандарт Linux для камер). |
videoconvert | filter | Автоматически преобразует формат видео, полученный с камеры, в тот, который понимает приёмник. |
autovideosink | sink | Умный приёмник, который сам выбирает, как и где отобразить видео: через X11, Wayland, DRM и т.п. |
⚠️ Если команда не работает, убедитесь:
- Камера подключена и доступна (можно проверить через
ls /dev/video*).- У вас есть права на доступ к устройству (иногда нужно быть в группе
video).
Что происходит при запуске:
- GStreamer создаёт пайплайн.
v4l2srcначинает захват видео с камеры (обычно в формате MJPEG или YUY2).videoconvertполучает этот поток и преобразует его в «нейтральный» формат, понятныйautovideosink.autovideosinkоткрывает окно и начинает отображать изображение в реальном времени.
Вы увидите окно с живым видео — возможно, с небольшой задержкой в доли секунды. Это и есть ваш первый рабочий медиапайплайн!
Пример 2: Захват экрана (Linux, X11)
Следующий пример покажет, как GStreamer может работать не только с внешними устройствами, но и с виртуальными источниками — например, с экраном:
gst-launch-1.0 ximagesrc use-damage=0 ! videoconvert ! autovideosink
Разбор команды:
| Элемент | Роль | Пояснение |
|---|---|---|
ximagesrc | source | Захватывает изображение экрана в системах с X11. Работает как «виртуальная камера». |
use-damage=0 | параметр | Отключает оптимизацию по изменённым областям. Без этого параметра изображение может мигать или не обновляться. |
videoconvert | filter | Преобразует формат X11-экрана (обычно xRGB) в формат, понятный приёмнику. |
autovideosink | sink | Отображает захваченный экран в окне. |
🔍 Примечание:
Этот элемент работает только на X11. В системах с Wayland нужно использоватьpipewiresrc(это выходит за рамки текущего примера, но будет важно в практике).
Что вы увидите:
Окно, в котором отображается ваш текущий экран, но, скорее всего, в уменьшенном размере и с низкой частотой кадров (по умолчанию — около 10–15 кадров в секунду). Это потому, что ximagesrc не оптимизирован для высокой производительности, но отлично подходит для демонстрации.
Пример 3: Тестовый источник видео (видеогенератор)
Иногда камеры или экран недоступны — например, при отладке на сервере. Тогда на помощь приходит videotestsrc — встроенный генератор тестовых изображений:
gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! autovideosink
Разбор команды:
| Элемент | Роль | Пояснение |
|---|---|---|
videotestsrc | source | Генерирует тестовое изображение: шахматный фон, цветные полосы, движущийся шарик и т.п. |
is-live=true | параметр | Говорит элементу вести себя как «живой» источник (не перезапускается, не идёт с нулевой задержкой). Критично для симуляции реальной камеры. |
videoconvert | filter | Приводит внутренний формат тестового изображения к виду, понятному приёмнику. |
autovideosink | sink | Отображает результат в окне. |
Что вы увидите:
Окно с анимированным тестовым паттерном — например, синий фон и движущийся красный шарик. Это стандартный способ проверить, что GStreamer работает, и поток может быть передан и отображён.
💡 Вы можете изменить паттерн:
gst-launch-1.0 videotestsrc pattern=smpte is-live=true ! videoconvert ! autovideosinkЗдесь
pattern=smpte— это известный цветовой тестовый сигнал, используемый в телевидении.
Сравнение трёх пайплайнов
Все три примера построены по одной и той же схеме. Вот как они выглядят рядом:
| Источник | Команда |
|---|---|
| Веб-камера | gst-launch-1.0 v4l2src ! videoconvert ! autovideosink |
| Экран (X11) | gst-launch-1.0 ximagesrc use-damage=0 ! videoconvert ! autovideosink |
| Тестовое видео | gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! autovideosink |
✅ Общее во всех трёх:
- Источник (
src) генерирует или захватывает видео.videoconvertобеспечивает совместимость.autovideosinkотображает результат.
Это и есть фундаментальный паттерн в GStreamer: вы можете заменять source или sink, но цепочка преобразования почти всегда остаётся.
Что дальше?
Теперь вы:
- Увидели, как GStreamer работает в реальности.
- Поняли, зачем нужен
videoconvert. - Научились запускать пайплайны с разными источниками.
В следующем шаге мы перейдём к сетевым источникам — в частности, к RTSP, который является основным способом получения видео с IP-камер. Вы увидите, что структура пайплайна остаётся похожей, но появляются новые элементы, такие как rtspsrc и decodebin.
💡 Совет: попробуйте запустить каждый из этих примеров на своём компьютере. Наблюдайте за поведением, меняйте параметры (например,
patternвvideotestsrc) — это лучший способ «почувствовать» GStreamer.