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

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/125 кадров в секунду (дробь: 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.

Он проходит в несколько этапов:

  1. Определение возможных форматов
    Каждый элемент сообщает, какие caps поддерживаются на своих пэдах.

  2. Поиск общего формата
    GStreamer ищет пересечение (общую часть) между caps источника и приёмника.

  3. Фиксация формата
    Если общий формат найден — пэды «соглашаются» на нём, и данные начинают течь.

Если пересечения нет — соединение не удаётся, и вы увидите ошибку вроде 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

Шаг за шагом:

  1. videotestsrc
    Генерирует тестовое видео. Его src-пэд поддерживает множество форматов: разные размеры, цветовые пространства, частоты кадров.

  2. video/x-raw,width=640,height=480
    Это capsfilter. Он говорит:

    «Я приму только несжатое видео 640×480. Всё остальное — отклоняю».

  3. autovideosink
    Приёмник, который отображает видео. Он проверяет:

    «Могу ли я показать несжатое видео 640×480? Да, могу».

  4. Negotiation проходит успешно
    Пэды «соглашаются» на формат video/x-raw,format=I420,width=640,height=480,framerate=30/1 (или другой, но в рамках 640×480).

  5. Данные начинают течь — вы видите тестовую картинку.


Подсказки для новичков

  • 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 и начать им управлять.