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

06-04-02 PiP: картинка-в-картинке для студийных задач

06-04-02

В современных видеотрансляциях — особенно в образовательных и конференционных сценариях — часто требуется не просто показывать основное видео, но и добавлять в него дополнительный визуальный элемент, например, изображение докладчика. Одним из самых простых и эффективных способов реализовать это — использовать технологию картинка-в-картинке (Picture-in-Picture, PiP). В этом разделе мы разберём, как реализовать PIP с помощью ffmpeg, какие параметры позволяют управлять положением, размером и прозрачностью вставляемого видео, а также какие инженерные аспекты нужно учитывать при работе с несколькими источниками.


Основной принцип PiP в FFMPEG

Ключевым инструментом для реализации PiP в ffmpeg является фильтр overlay. Он позволяет наложить один видеопоток поверх другого, точно так же, как слои в графических редакторах. Основной поток (например, презентация или слайды) выступает в роли фона, а вторичный (например, докладчик с камеры) — вставляется как «плавающее» окно.

Простейшая команда для создания PiP-видео выглядит так:

ffmpeg -i main.mp4 -i cam.mp4 -filter_complex "[0:v][1:v]overlay=W-w-20:H-h-20" -c:v libx264 -c:a copy out.mp4

Разберём её по частям:

  • -i main.mp4 — основной источник видео (например, запись слайдов).
  • -i cam.mp4 — вторичный источник (видео с камеры докладчика).
  • -filter_complex "[0:v][1:v]overlay=W-w-20:H-h-20" — применение фильтра overlay:
    • [0:v] — видео из первого входа (main.mp4).
    • [1:v] — видео из второго входа (cam.mp4).
    • overlay=W-w-20:H-h-20 — формула позиционирования: правый нижний угол с отступом 20 пикселей.
      • W — ширина основного видео.
      • H — высота основного видео.
      • w — ширина вставляемого видео.
      • h — высота вставляемого видео.
  • -c:v libx264 — кодирование результирующего видео в H.264.
  • -c:a copy — аудиопоток копируется без перекодирования (в данном случае берётся из main.mp4).
  • out.mp4 — выходной файл.

⚠️ Важно: поскольку фильтр overlay требует обработки видеоданных, ffmpeg автоматически декодирует оба видео, применяет наложение и затем перекодирует результат. Это означает, что нельзя использовать -c copy для видео, если применяются фильтры.


Управление положением и размером PiP-окна

Хотя стандартное позиционирование в правом нижнем углу (W-w-20:H-h-20) — распространённый выбор, в зависимости от задачи может потребоваться другое расположение. Ниже приведены типичные варианты:

ПоложениеФормула overlayКомментарий
Левый верхний уголoverlay=20:20Простое смещение от левого верхнего угла
Правый верхний уголoverlay=W-w-20:20Отступ 20 пикселей от краёв
Левый нижний уголoverlay=20:H-h-20Подходит для телевизионного стиля
Центр экранаoverlay=(W-w)/2:(H-h)/2Центрирование по обеим осям
По центру справаoverlay=W-w-20:(H-h)/2Часто используется в интервью

Если необходимо изменить размер вставляемого видео (например, уменьшить изображение докладчика), можно использовать фильтр scale:

ffmpeg -i main.mp4 -i cam.mp4 -filter_complex "
[1:v]scale=320:240[small];
[0:v][small]overlay=W-w-20:H-h-20
" -c:v libx264 -c:a copy out.mp4

Здесь:

  • [1:v]scale=320:240[small] — видео с камеры уменьшается до 320×240 и сохраняется как временный поток [small].
  • Далее этот поток используется в overlay.

Прозрачность и альфа-канал

Стандартные видеоформаты (например, H.264 в MP4) не поддерживают альфа-канал (прозрачность). Однако ffmpeg позволяет работать с прозрачными изображениями, если исходный поток или файл содержит альфа-канал (например, в формате RGBA).

Чтобы наложить полупрозрачное изображение, нужно:

  1. Убедиться, что вставляемое видео или изображение имеет альфа-канал.
  2. Указать формат rgba при декодировании.
  3. При необходимости — изменить уровень прозрачности с помощью фильтра colorchannelmixer.

Пример с изменением прозрачности:

ffmpeg -i main.mp4 -i cam_with_alpha.mov -filter_complex "
[1:v]format=rgba,colorchannelmixer=aa=0.7[semi_trans];
[0:v][semi_trans]overlay=W-w-20:H-h-20
" -c:v libx264 -c:a copy out.mp4

Здесь:

  • format=rgba — гарантирует, что видео обрабатывается с альфа-каналом.
  • colorchannelmixer=aa=0.7 — устанавливает альфа-канал (прозрачность) на 70% (0.7), делая изображение полупрозрачным.

💡 Совет: если у вас нет видео с альфа-каналом, можно использовать PNG-изображение как источник прозрачности, например, для наложения логотипа с фоном.


Работа с аудио: синхронизация и выбор источника

При комбинировании двух видео возникает вопрос: какой аудиопоток использовать?

В примере выше используется -c:a copy, что означает копирование аудио из первого входа (main.mp4). Если докладчик говорит в камере, а слайды не содержат звука, это может быть неудобно.

Варианты решения:

  1. Использовать аудио с камеры:

    -map 1:a -c:a copy

    Это выберет аудиодорожку из cam.mp4.

  2. Смешать аудио с двух источников: Если, например, в main.mp4 есть фоновая музыка, а в cam.mp4 — голос докладчика, можно использовать фильтр amix:

    ffmpeg -i main.mp4 -i cam.mp4 -filter_complex "
    [0:v][1:v]overlay=W-w-20:H-h-20[v];
    [0:a][1:a]amix=inputs=2:normalize=1[a]
    " -map "[v]" -map "[a]" -c:v libx264 -c:a aac out.mp4

    Здесь:

    • [v] — результат наложения видео.
    • [a] — смешанный аудиопоток.
    • normalize=1 — нормализует громкость, чтобы не было резких скачков.
  3. Синхронизация аудио и видео: Если источники имеют разную задержку (например, камера с высоким latency), может возникнуть рассинхрон. В этом случае можно использовать фильтр adelay:

    [1:a]adelay=500|500  # задержка 500 мс для обоих каналов

PiP в реальном времени: работа с потоками

Описанный подход легко адаптируется для потоковой передачи. Вместо файлов можно использовать RTSP, RTMP, SRT или другие сетевые источники.

Пример трансляции PIP в RTMP:

ffmpeg -i rtmp://server/live/presentation -i rtsp://cam/ip/stream -filter_complex "
[1:v]scale=320:240[cam];
[0:v][cam]overlay=W-w-20:H-h-20
" -c:v libx264 -preset veryfast -tune zerolatency -c:a aac -f flv rtmp://cdn/live/output

Здесь:

  • Основной поток — презентация по RTMP.
  • Второй поток — камера по RTSP.
  • Результат отправляется на CDN для трансляции.

⚠️ Замечание по задержке: при использовании нескольких сетевых источников общая задержка увеличивается, так как:

  • Каждый поток имеет собственную сетевую задержку.
  • ffmpeg должен декодировать оба потока перед наложением.
  • Фильтр overlay требует буферизации кадров для синхронизации.

Влияние PiP на производительность и задержку

Добавление PiP — это не просто «наложение картинки». Это полноценная операция обработки, которая влияет на систему следующим образом:

ФакторВлияние
ДекодированиеТребуется декодировать два видеопотока вместо одного → нагрузка на CPU возрастает
ФильтрацияФильтр overlay требует буферизации кадров → добавляет задержку (обычно на 1–3 кадра)
КодированиеРезультат нужно перекодировать → дополнительная нагрузка и буферизация в кодере
СинхронизацияНеобходимо выравнивать временные метки (PTS) потоков → возможны задержки при рассогласовании

Чтобы минимизировать задержку:

  • Используйте -tune zerolatency и -preset ultrafast для кодера.
  • Убедитесь, что оба источника имеют минимальную задержку (например, RTSP по TCP с малым буфером).
  • По возможности — используйте аппаратное ускорение декодирования/кодирования (например, -c:v h264_nvenc).

Типовые сценарии использования PiP

СценарийОсобенности
Онлайн-лекцииДокладчик поверх слайдов. Важна синхронизация и читаемость текста на слайдах.
ВебинарыУчастник в углу экрана. Часто используется масштабирование и прозрачность.
Трансляция конференцийНесколько спикеров по очереди. PIP позволяет быстро переключать активного докладчика.
ВидеонаблюдениеКамера наблюдения с наложенным видео с тревожной кнопки или датчика.

Заключение

Технология PiP — это простой, но мощный инструмент для создания информативных и визуально насыщенных видеоматериалов. С помощью ffmpeg и фильтра overlay можно реализовать её как в файловых, так и в потоковых сценариях. Однако важно помнить, что любая обработка — это компромисс между качеством, задержкой и нагрузкой на систему.

При проектировании PiP-решения рекомендуется:

  • Чётко определить источник аудио.
  • Учитывать задержку каждого входа.
  • Минимизировать количество перекодирований.
  • Тестировать на реальных условиях (с сетевыми задержками и разной нагрузкой).

В следующих разделах мы рассмотрим более сложные сценарии комбинирования — такие как мозаика из нескольких камер и наложение динамических титров.