Caps и negotiation: как элементы договариваются о формате
Одна из ключевых особенностей GStreamer — его способность гибко работать с разнообразными медиапотоками: видео, аудио, субтитры, метаданные. Но чтобы элементы пайплайна могли обмениваться данными, им нужно договориться о формате этих данных. За это отвечают caps (сокращение от capabilities — возможности) и процесс negotiation (согласование формата). Без понимания этих концепций команды gst-launch будут выглядеть как непонятные строки с кучей параметров. Давайте разберёмся, как это работает.
Что такое Caps (capabilities)
Caps — это описание формата данных на пэде элемента. Другими словами, caps отвечают на вопрос: «В каком виде этот элемент готов принимать или отдавать медиаданные?»
Каждый пэд (вход или выход элемента) имеет свои caps. Они определяют:
- Тип медиа (видео, аудио, текст и т.д.)
- Кодек или формат хранения данных
- Разрешение видео
- Частоту кадров (fps)
- Частоту дискретизации аудио (sample rate)
- Количество каналов
- Цветовое пространство
- И другие параметры
Пример caps-строки
Вот пример caps для видео:
video/x-raw,format=I420,width=1280,height=720,framerate=25/1
Разберём по частям:
| Часть | Значение |
|---|---|
video/x-raw | Тип медиа — несжатое видео |
format=I420 | Цветовой формат (YUV 4:2:0) |
width=1280 | Ширина кадра в пикселях |
height=720 | Высота кадра в пикселях |
framerate=25/1 | 25 кадров в секунду (дробь: 25/1 = 25.0) |
💡 Обратите внимание: дроби используются для точного представления частот, например,
30000/1001≈ 29.97 кадров в секунду — стандарт для NTSC-видео.
Другие примеры caps:
-
Аудио:
audio/x-raw,format=S16LE,rate=48000,channels=2
→ 16-битный PCM, 48 кГц, стерео -
Сжатое видео (H.264):
video/x-h264,stream-format=byte-stream,profile=baseline,level=(string)3.1,width=1920,height=1080,framerate=30/1
Caps — это не данные, а описание данных. Это как этикетка на коробке: «внутри — видео 720p, I420, 25 кадров/с». Сама коробка (буфер) приходит позже.
Как работает negotiation (согласование формата)
Когда вы соединяете два элемента в пайплайне, например:
videotestsrc ! autovideosink
GStreamer сначала проверяет, могут ли они обмениваться данными. Этот процесс называется negotiation.
Он проходит в несколько этапов:
-
Определение возможных форматов
Каждый элемент сообщает, какие caps поддерживаются на своих пэдах. -
Поиск общего формата
GStreamer ищет пересечение (общую часть) между caps источника и приёмника. -
Фиксация формата
Если общий формат найден — пэды «соглашаются» на нём, и данные начинают течь.
Если пересечения нет — соединение не удаётся, и вы увидите ошибку вроде pad link failed.
Пример: принудительное согласование через capsfilter
Иногда автоматического согласования недостаточно. Тогда вы можете явно указать, какой формат вы хотите, с помощью элемента capsfilter.
Например:
gst-launch-1.0 videotestsrc ! video/x-raw,width=640,height=480 ! autovideosink
Здесь:
videotestsrc— источник тестового видео (по умолчанию может генерировать разные размеры)video/x-raw,width=640,height=480— это не отдельный элемент, а фильтр caps, встроенный в синтаксисgst-launch- На самом деле, за кулисами GStreamer создаёт элемент
capsfilterс соответствующими caps
Это означает:
«Я хочу, чтобы между
videotestsrcиautovideosinkпроходило только видео 640×480, несжатое, любого цветового формата и fps, который они смогут согласовать».
Визуализация процесса
Представьте, что у вас есть два человека:
- Первый говорит: «Я могу говорить по-русски, по-английски и по-французски».
- Второй говорит: «Я понимаю только русский и немецкий».
Они договариваются говорить по-русски — это и есть negotiation.
В GStreamer:
- Первый человек —
videotestsrc→ предлагает caps: 640×480, 1280×720, I420, YUY2... - Второй —
autovideosink→ принимает: I420, NV12, RGB, но только 640×480 - Общий формат:
video/x-raw,format=I420,width=640,height=480→ согласование прошло
Зачем это нужно: контроль и предсказуемость
Понимание caps и negotiation важно по нескольким причинам:
1. Чтобы не бояться «страшных строк»
Многие новички пугаются, видя длинные caps-строки в примерах. Но теперь вы знаете: это просто человекочитаемое описание формата. Как техническая спецификация.
Это не магия — это договорённость между элементами.
2. Чтобы исправлять ошибки
Если пайплайн не работает, часто проблема в несовместимых caps. Например:
- Источник выдаёт H.264 в формате
byte-stream, а декодер ожидаетavc - Видео 4K, а
videoscaleне настроен — иautovideosinkне может отобразить
Знание caps помогает понять, где разрыв, и вставить нужный элемент (например, h264parse или videoscale).
3. Чтобы управлять производительностью
Принудительное указание формата через capsfilter может:
- Ускорить negotiation (меньше вариантов перебирать)
- Избежать ненужных преобразований
- Контролировать нагрузку (например, ограничить разрешение)
Практический пример: анализ пайплайна
Рассмотрим реальную команду:
gst-launch-1.0 videotestsrc ! video/x-raw,width=640,height=480 ! autovideosink
Шаг за шагом:
-
videotestsrc
Генерирует тестовое видео. Егоsrc-пэд поддерживает множество форматов: разные размеры, цветовые пространства, частоты кадров. -
video/x-raw,width=640,height=480
Это capsfilter. Он говорит:«Я приму только несжатое видео 640×480. Всё остальное — отклоняю».
-
autovideosink
Приёмник, который отображает видео. Он проверяет:«Могу ли я показать несжатое видео 640×480? Да, могу».
-
Negotiation проходит успешно
Пэды «соглашаются» на форматvideo/x-raw,format=I420,width=640,height=480,framerate=30/1(или другой, но в рамках 640×480). -
Данные начинают течь — вы видите тестовую картинку.
Подсказки для новичков
-
Caps — это не страшно. Читайте их как техническое описание: «вот такой формат я хочу».
-
Используйте
capsfilter, когда нужно зафиксировать формат. Особенно при соединении сложных элементов. -
Если пайплайн не работает — проверьте caps. Возможно, элементы не могут договориться.
-
Инструмент
gst-inspect-1.0поможет посмотреть, какие caps поддерживает элемент:gst-inspect-1.0 videotestsrcВ выводе ищите раздел
SRC template:, там будут перечислены поддерживаемые caps.
Итог
- Caps — это описание формата данных на пэде элемента (видео, аудио и т.д.).
- Negotiation — процесс, при котором два элемента договариваются о едином формате передачи данных.
- Вы можете влиять на negotiation, явно указывая желаемый формат через
capsfilter. - Понимание caps помогает читать, писать и отлаживать пайплайны, а не бояться «непонятных строк».
Когда вы видите строку вроде video/x-raw,width=640,height=480, не думайте: «Что это за шифровка?». Думайте:
«Ага, это видео: несжатое, 640 на 480. Всё логично».
Это — первый шаг к тому, чтобы перестать бояться GStreamer и начать им управлять.