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

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

Разбор команды:

ЭлементРольПояснение
v4l2srcsourceИсточник видео с камеры через интерфейс Video4Linux2 (стандарт Linux для камер).
videoconvertfilterАвтоматически преобразует формат видео, полученный с камеры, в тот, который понимает приёмник.
autovideosinksinkУмный приёмник, который сам выбирает, как и где отобразить видео: через X11, Wayland, DRM и т.п.

⚠️ Если команда не работает, убедитесь:

  • Камера подключена и доступна (можно проверить через ls /dev/video*).
  • У вас есть права на доступ к устройству (иногда нужно быть в группе video).

Что происходит при запуске:

  1. GStreamer создаёт пайплайн.
  2. v4l2src начинает захват видео с камеры (обычно в формате MJPEG или YUY2).
  3. videoconvert получает этот поток и преобразует его в «нейтральный» формат, понятный autovideosink.
  4. autovideosink открывает окно и начинает отображать изображение в реальном времени.

Вы увидите окно с живым видео — возможно, с небольшой задержкой в доли секунды. Это и есть ваш первый рабочий медиапайплайн!


Пример 2: Захват экрана (Linux, X11)

Следующий пример покажет, как GStreamer может работать не только с внешними устройствами, но и с виртуальными источниками — например, с экраном:

gst-launch-1.0 ximagesrc use-damage=0 ! videoconvert ! autovideosink

Разбор команды:

ЭлементРольПояснение
ximagesrcsourceЗахватывает изображение экрана в системах с X11. Работает как «виртуальная камера».
use-damage=0параметрОтключает оптимизацию по изменённым областям. Без этого параметра изображение может мигать или не обновляться.
videoconvertfilterПреобразует формат X11-экрана (обычно xRGB) в формат, понятный приёмнику.
autovideosinksinkОтображает захваченный экран в окне.

🔍 Примечание:
Этот элемент работает только на X11. В системах с Wayland нужно использовать pipewiresrc (это выходит за рамки текущего примера, но будет важно в практике).

Что вы увидите:

Окно, в котором отображается ваш текущий экран, но, скорее всего, в уменьшенном размере и с низкой частотой кадров (по умолчанию — около 10–15 кадров в секунду). Это потому, что ximagesrc не оптимизирован для высокой производительности, но отлично подходит для демонстрации.


Пример 3: Тестовый источник видео (видеогенератор)

Иногда камеры или экран недоступны — например, при отладке на сервере. Тогда на помощь приходит videotestsrcвстроенный генератор тестовых изображений:

gst-launch-1.0 videotestsrc is-live=true ! videoconvert ! autovideosink

Разбор команды:

ЭлементРольПояснение
videotestsrcsourceГенерирует тестовое изображение: шахматный фон, цветные полосы, движущийся шарик и т.п.
is-live=trueпараметрГоворит элементу вести себя как «живой» источник (не перезапускается, не идёт с нулевой задержкой). Критично для симуляции реальной камеры.
videoconvertfilterПриводит внутренний формат тестового изображения к виду, понятному приёмнику.
autovideosinksinkОтображает результат в окне.

Что вы увидите:

Окно с анимированным тестовым паттерном — например, синий фон и движущийся красный шарик. Это стандартный способ проверить, что 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.