картинка в картинке
Добавлено: 05 мар 2026, 04:51
Сделать эффект «картинка в картинке» (Picture-in-Picture) в FFmpeg можно с помощью фильтра `overlay`. Это мощный инструмент, который позволяет накладывать один видеопоток на другой с высокой точностью.
### Базовая команда
Самый простой вариант — поместить второе видео в левый верхний угол первого:
```bash
```
### Как это работает:
* `-i main_video.mp4`: Основное (фоновое) видео.
* `-i overlay_video.mp4`: Видео, которое будет сверху.
* `-filter_complex`: Команда для сложных фильтров.
* `overlay=10:10`: Координаты $x$ и $y$ для верхнего левого угла накладываемого видео (в пикселях).
---
### Продвинутые варианты размещения
Чтобы не высчитывать пиксели вручную, можно использовать встроенные переменные:
| Положение | Команда (параметр overlay) |
| --- | --- |
| **Справа вверху** | `overlay=W-w-10:10` |
| **Справа внизу** | `overlay=W-w-10:H-h-10` |
| **Слева внизу** | `overlay=10:H-h-10` |
| **По центру** | `overlay=(W-w)/2:(H-h)/2` |
> **Пояснение переменных:**
> * `W`, `H` — ширина и высота основного видео.
> * `w`, `h` — ширина и высота накладываемого видео.
> * `10` — это небольшой отступ от края (можно менять).
>
>
---
### Изменение размера «картинки в картинке»
Обычно накладываемое видео слишком большое. Его нужно уменьшить перед наложением. Для этого мы сначала пропускаем второе видео через фильтр `scale`:
```bash
```
**Разбор цепочки:**
1. `[1:v]scale=400:-1[inner]`: Берем второе видео (`1:v`), меняем его ширину до 400 пикселей (высота подберется автоматически для сохранения пропорций) и называем этот результат `[inner]`.
2. `[0:v][inner]overlay...`: Берем основное видео (`0:v`) и накладываем на него наш уменьшенный фрагмент `[inner]`.
---
### Что делать со звуком?
По умолчанию FFmpeg возьмет аудиодорожку только из первого видео. Если вам нужно смешать звук из обоих роликов, добавьте фильтр `amix`:
```bash
```
### Полезный совет
Если видео имеют разную частоту кадров или формат, добавление `-shortest` в конце команды заставит FFmpeg завершить кодирование, как только закончится самое короткое видео.
### Базовая команда
Самый простой вариант — поместить второе видео в левый верхний угол первого:
```bash
Код: Выделить всё
ffmpeg -i main_video.mp4 -i overlay_video.mp4 -filter_complex "overlay=10:10" output.mp4
### Как это работает:
* `-i main_video.mp4`: Основное (фоновое) видео.
* `-i overlay_video.mp4`: Видео, которое будет сверху.
* `-filter_complex`: Команда для сложных фильтров.
* `overlay=10:10`: Координаты $x$ и $y$ для верхнего левого угла накладываемого видео (в пикселях).
---
### Продвинутые варианты размещения
Чтобы не высчитывать пиксели вручную, можно использовать встроенные переменные:
| Положение | Команда (параметр overlay) |
| --- | --- |
| **Справа вверху** | `overlay=W-w-10:10` |
| **Справа внизу** | `overlay=W-w-10:H-h-10` |
| **Слева внизу** | `overlay=10:H-h-10` |
| **По центру** | `overlay=(W-w)/2:(H-h)/2` |
> **Пояснение переменных:**
> * `W`, `H` — ширина и высота основного видео.
> * `w`, `h` — ширина и высота накладываемого видео.
> * `10` — это небольшой отступ от края (можно менять).
>
>
---
### Изменение размера «картинки в картинке»
Обычно накладываемое видео слишком большое. Его нужно уменьшить перед наложением. Для этого мы сначала пропускаем второе видео через фильтр `scale`:
```bash
Код: Выделить всё
ffmpeg -i main_video.mp4 -i overlay_video.mp4 -filter_complex "[1:v]scale=400:-1[inner]; [0:v][inner]overlay=W-w-20:H-h-20" output.mp4
**Разбор цепочки:**
1. `[1:v]scale=400:-1[inner]`: Берем второе видео (`1:v`), меняем его ширину до 400 пикселей (высота подберется автоматически для сохранения пропорций) и называем этот результат `[inner]`.
2. `[0:v][inner]overlay...`: Берем основное видео (`0:v`) и накладываем на него наш уменьшенный фрагмент `[inner]`.
---
### Что делать со звуком?
По умолчанию FFmpeg возьмет аудиодорожку только из первого видео. Если вам нужно смешать звук из обоих роликов, добавьте фильтр `amix`:
```bash
Код: Выделить всё
ffmpeg -i main_video.mp4 -i overlay_video.mp4 -filter_complex "[1:v]scale=320:-1[inner]; [0:v][inner]overlay=W-w-10:10[outv]; [0:a][1:a]amix=inputs=2[outa]" -map "[outv]" -map "[outa]" output.mp4### Полезный совет
Если видео имеют разную частоту кадров или формат, добавление `-shortest` в конце команды заставит FFmpeg завершить кодирование, как только закончится самое короткое видео.