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

07-05-03 Аудио: audiomixer, volume и синхронизация

В этой части мы переходим от видео к обработке аудио в GStreamer. Хотя лекция в целом фокусируется на визуальных потоках, важно понимать, что GStreamer — это мультимедийный фреймворк, и его сила в том, что он одинаково хорошо работает как с видео, так и со звуком. Более того, архитектура обработки аудио полностью соответствует той, что используется для видео: элементы, пэды, капабилити, очереди и синхронизация. Это позволяет легко комбинировать аудио- и видеопотоки в едином пайплайне.

В данном разделе рассмотрим три ключевых элемента для работы со звуком: audiomixer, volume и queue, а также затронем важность согласования форматов (caps) и синхронизации между источниками.


Аудиомикшер: объединение нескольких источников

Что такое audiomixer

Элемент audiomixer — это аналог аудиомикшера в реальной студии: он позволяет смешивать несколько аудиопотоков в один выходной поток. Это полезно, например, когда у вас есть несколько IP-камер с микрофонами, и вы хотите объединить их звук в единый аудиоканал — например, для трансляции в OBS или записи.

audiomixer — это многовходовой элемент. У него есть один src-пэд (выход) и несколько sink-пэдов (входы). Вы можете подключать к нему разные источники, и он автоматически выполнит арифметическое сложение аудиосэмплов, нормализуя результат, чтобы избежать перегрузки (clipping).

Как работает микширование

Представьте, что у вас два человека говорят одновременно в двух разных комнатах, и вы хотите слышать оба голоса. Аудиомикшер берёт сэмплы с обоих потоков, складывает их поэлементно и выдаёт итоговый поток. При этом он не меняет тайминги — каждый входной поток сохраняет свои временные метки (timestamps), а микшер просто объединяет данные, когда они приходят.

💡 Важно: Все входы в audiomixer должны иметь одинаковый формат (количество каналов, частоту дискретизации, тип данных). Если форматы отличаются — микшер не сможет их объединить.


Пример: свод двух звуковых тонов

Рассмотрим простой, но наглядный пример использования audiomixer:

gst-launch-1.0 \
audiotestsrc freq=440 ! audiomixer name=mix ! autoaudiosink \
audiotestsrc freq=660 ! mix.

Разберём этот пайплайн по частям:

  1. audiotestsrc freq=440 — генерирует синусоидальный тон с частотой 440 Гц (нота «ля»).
  2. audiomixer name=mix — создаёт элемент микшера с именем mix.
  3. autoaudiosink — выводит итоговый звук на аудиоустройство.
  4. audiotestsrc freq=660 — второй генератор, на частоте 660 Гц.
  5. ! mix. — подключает второй источник к микшеру. Обратите внимание: имя mix. (с точкой) — это сокращённая запись, означающая «подключить к любому свободному sink-пэду элемента mix».

🔍 Техническая деталь: audiotestsrc по умолчанию генерирует моно-аудио (channels=1) с частотой дискретизации (не звука) 48000 Гц. audiomixer также по умолчанию ожидает такой же формат. Поэтому в данном случае согласование форматов происходит автоматически — автоподбор (autoplugging) срабатывает корректно.

Если вы запустите этот пайплайн, услышите два одновременных тона — 440 Гц и 660 Гц. Это демонстрирует, что GStreamer действительно может работать с несколькими аудиопотоками параллельно.


Управление громкостью: элемент volume

Назначение volume

Даже в простом микшере важно управлять уровнем громкости. Например, один микрофон может быть слишком громким, а другой — тихим. Для этого в GStreamer есть элемент volume.

Он позволяет:

  • Увеличивать или уменьшать громкость (gain).
  • Включать/выключать звук (mute).
  • Плавно изменять уровень (ramp).

Пример с регулировкой громкости

Модифицируем предыдущий пайплайн, чтобы один из тонов был тише:

gst-launch-1.0 \
audiotestsrc freq=440 ! volume volume=0.8 ! mix. \
audiotestsrc freq=660 ! volume volume=0.3 ! mix. \
audiomixer name=mix ! autoaudiosink

Здесь:

  • Первый тон играет на 80% громкости.
  • Второй — на 30%, то есть почти втрое тише.

📌 Примечание: Порядок элементов важен. volume должен стоять до audiomixer, потому что микшер работает с уже «готовыми» аудиоданными. Если поставить volume после микшера — вы будете регулировать уже общий уровень, а не отдельные каналы.


Согласование форматов: caps и audio/x-raw

Почему важны капабилити (caps)

Как уже упоминалось, audiomixer требует, чтобы все входы имели одинаковый формат. В противном случае GStreamer не сможет соединить элементы, и пайплайн не запустится.

Формат аудиопотока описывается строкой caps (capabilities). Например:

audio/x-raw,format=S16LE,layout=interleaved,rate=48000,channels=2

Разберём её:

  • audio/x-raw — несжатый аудио.
  • format=S16LE — 16-битные знаковые целые числа, little-endian.
  • layout=interleaved — данные чередуются по каналам (LRLRLR…).
  • rate=48000 — частота дискретизации 48 кГц.
  • channels=2 — стерео.

Принудительное задание формата

Чтобы избежать ошибок, рекомендуется явно указывать требуемый формат с помощью capsfilter. Это особенно важно, если вы работаете с разными источниками (например, микрофон и файл), которые могут использовать разные настройки.

Пример с явным указанием формата:

gst-launch-1.0 \
audiotestsrc freq=440 ! audioconvert ! audio/x-raw,channels=2,rate=48000 ! mix. \
audiotestsrc freq=660 ! audioconvert ! audio/x-raw,channels=2,rate=48000 ! mix. \
audiomixer name=mix ! autoaudiosink

Здесь:

  • audioconvert — преобразует аудио в нужный формат (например, из моно в стерео).
  • audio/x-raw,channels=2,rate=48000 — фильтр, который гарантирует, что на вход микшера подаются стерео-данные с частотой 48 кГц.

💡 Совет: Всегда используйте audioconvert перед audiomixer, если есть сомнения в формате источника. Это делает пайплайн более надёжным.


Очереди и синхронизация: роль queue

Зачем нужна queue в аудиопотоке

Элемент queue — это буфер, который разделяет части пайплайна. Он выполняет несколько функций:

  • Позволяет потокам работать в разных потоках (multithreading).
  • Защищает от перегрузки (backpressure).
  • Помогает синхронизировать аудио и видео.

Однако каждая очередь — это потенциальный источник задержки. Поэтому её использование должно быть обоснованным.

Пример с очередью

audiotestsrc freq=440 ! audioconvert ! queue ! audio/x-raw,channels=2,rate=48000 ! mix.

Здесь queue добавляет буфер между преобразованием и микшером. Это может быть полезно, если микшер временно не готов принимать данные (например, из-за перегрузки CPU).

⚠️ Осторожно: избыточные очереди увеличивают общую задержку пайплайна. В задачах с низкой латентностью (например, мониторинг) их следует минимизировать.


Синхронизация аудио и видео

Общая архитектура синхронизации

GStreamer автоматически синхронизирует аудио и видео по таймстемпам (timestamps), если они присутствуют. Каждый буфер (кадр или сэмпл) помечается временем, и синк (например, autovideosink) ждёт, когда придет соответствующий аудиобуфер.

Однако в случае микширования нескольких аудиопотоков важно, чтобы:

  • Все источники имели корректные таймстемпы.
  • Не было значительного дрейфа между ними.

Если один микрофон начинает передавать данные с задержкой, это может привести к рассинхронизации с видео.

Как управлять синхронизацией

  • По умолчанию autoaudiosink и autovideosink работают в режиме sync=true — они ждут точного времени воспроизведения.
  • Для задач, где важна минимальная задержка (например, просмотр в реальном времени), можно отключить синхронизацию:
autoaudiosink sync=false

Это заставит аудио выводиться немедленно по готовности, без ожидания системного времени. Однако это может привести к рассинхрону с видео, если оно обрабатывается отдельно.


Сводка: ключевые принципы

ЭлементНазначениеРекомендации
audiomixerСмешивание нескольких аудиопотоковВсе входы должны иметь одинаковый формат
volumeРегулировка громкостиРазмещать перед микшером для управления отдельными каналами
audioconvertПреобразование форматаИспользовать перед микшером для согласования
capsfilterФиксация форматаЯвно задавать channels, rate для надёжности
queueБуферизация и многопоточностьИспользовать умеренно, чтобы не увеличивать задержку
sync=falseОтключение синхронизацииПрименять в режиме мониторинга, но не в записи

Заключение

Работа со звуком в GStreamer следует той же логике, что и обработка видео: модульность, явные форматы, буферы и синхронизация. Элементы audiomixer, volume и queue позволяют строить гибкие аудиосистемы — от простого свода двух микрофонов до сложных многоканальных сценариев.

Главное преимущество GStreamer — в единообразии архитектуры. То, что вы узнали о видео (например, в compositor), напрямую применимо к аудио (audiomixer). Это позволяет легко комбинировать разные медиапотоки в одном пайплайне — например, показывать видео с двух камер и слышать звук с обеих одновременно.

В следующих разделах мы увидим, как объединять такие аудио- и видеопотоки в единый мультимедийный выход — например, для трансляции в OBS или веб-браузер.