- project/
- input/ — исходники
- output/ — результаты
- logs/ — логи
- scripts/ — Python‑скрипты
Пример: batch обработка каталога (нормализация, кодеки, FPS)
Ниже простой скрипт, который проходит по папке, конвертирует в H.264/AAC, нормализует громкость и приводит к 1080p/30fps.
import subprocess, sys
from pathlib import Path
INPUT_DIR = Path('input')
OUTPUT_DIR = Path('output')
OUTPUT_DIR.mkdir(exist_ok=True)
VIDEO_EXT = {'.mp4', '.mov', '.mkv', '.avi', '.webm'}
def run(cmd):
print(' '.join(cmd))
subprocess.run(cmd, check=True)
def transcode(in_path: Path, out_path: Path):
## Масштаб с сохранением пропорций + паддинг до 1920x1080, SAR=1 (квадратные пиксели)
vf = (
"scale=w=1920:h=1080:force_original_aspect_ratio=decrease," \
"pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=1"
)
cmd = [
'ffmpeg', '-y', '-hide_banner',
'-i', str(in_path),
'-vf', vf, '-r', '30',
'-c:v', 'libx264', '-preset', 'slow', '-crf', '18',
'-c:a', 'aac', '-b:a', '160k', '-af', 'loudnorm=I=-16:LRA=11:TP=-1.5',
'-movflags', '+faststart',
str(out_path)
]
run(cmd)
if __name__ == '__main__':
files = [p for p in INPUT_DIR.rglob('*') if p.suffix.lower() in VIDEO_EXT]
if not files:
print('Нет входных файлов в input/')
sys.exit(0)
for p in files:
rel = p.relative_to(INPUT_DIR)
out = (OUTPUT_DIR / rel).with_suffix('.mp4')
out.parent.mkdir(parents=True, exist_ok=True)
transcode(p, out)
Советы:
- Для вертикали используйте crop/rotate перед
pad (см. vertical‑форматы).
- Для более лёгких файлов —
-crf 20–23 или профиль компрессии. Для максимально высокого качества — -crf 16–18.
Нарезка и склейка: быстрые шаблоны
- Быстрая нарезка без перекодирования (если кодеки подходят):
ffmpeg -ss 00:00:05 -to 00:00:15 -i in.mp4 -c copy clip.mp4
- Кадр‑точная нарезка (с перекодированием):
ffmpeg -ss 5 -i in.mp4 -to 10 -c:v libx264 -c:a aac precise_clip.mp4
- Склейка через concat demuxer (без перекодирования; все файлы должны совпадать по параметрам):
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy merged.mp4
- Или через filter_complex (с перекодированием):
ffmpeg -i clip1.mp4 -i clip2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 -c:a aac merged.mp4
См. готовые инструменты для склейки и авто‑монтажа.
Сабы, перевод и озвучка через API интеграции
Схема:
- Транскрипция ⇒ SRT/JSON сегменты. 2) Перевод SRT. 3) Опционально: TTS‑озвучка + сведение.
Пример Python‑псевдокода с REST API:
import requests, json
API = 'https://your-asr.example.com'
with open('input/in.mp4', 'rb') as f:
r = requests.post(f'{API}/transcribe', files={'file': f})
segments = r.json()['segments'] # [{'start':0.2,'end':1.8,'text':'...'}]
## Сохранить SRT
def to_srt(segs, path):
def fmt(t):
h=int(t//3600); m=int((t%3600)//60); s=t%60
return f"{h:02d}:{m:02d}:{s:06.3f}".replace('.', ',')
with open(path,'w',encoding='utf-8') as s:
for i,sg in enumerate(segs,1):
s.write(f"{i}
{fmt(sg['start'])} --> {fmt(sg['end'])}
{sg['text']}
")
to_srt(segments, 'subs_ru.srt')
## Перевод SRT (любой MT‑API)
tr = requests.post('https://your-mt.example.com/translate', json={'lang':'en','srt':open('subs_ru.srt').read()}).json()
open('subs_en.srt','w',encoding='utf-8').write(tr['srt'])
Наложение сабов (burn‑in):
ffmpeg -i output/ready.mp4 -vf "subtitles=subs_en.srt:force_style='Fontsize=20,Outline=1'" -c:a copy out_subbed.mp4
Озвучка TTS: сгенерируйте файл озвучки и замените аудио‑дорожку:
ffmpeg -i output/ready.mp4 -i voice_en.mp3 -map 0:v -map 1:a -shortest -c:v copy -c:a aac dubbed.mp4
См. страницы: автосаб, перевод видео, озвучка ИИ, транскрипция, суммаризация, дубляж интервью.
Конвертация кодеков и пресеты
Ниже краткая шпаргалка для ffmpeg для видео и аудио:
| Сценарий |
Видео |
Аудио |
Аргументы FFmpeg |
Примечание |
| Универсальная публикация |
H.264 |
AAC |
-c:v libx264 -preset medium -crf 18 -c:a aac -b:a 160k -movflags +faststart |
Максимальная совместимость (веб/соцсети) |
| Экономия места |
H.265 |
AAC/Opus |
-c:v libx265 -crf 23 -preset slow |
Медленнее кодирует, лучше битрейт/качество |
| Современная эффективность |
AV1 |
Opus/AAC |
-c:v libsvtav1 -crf 28 -preset 6 |
Отличный VOD, поддержка постепенно растёт |
| Аппаратное ускорение |
NVENC |
AAC |
-c:v h264_nvenc -cq 19 -preset p5 |
Высокая скорость на GPU, чуть ниже эффективность |
Дополнительно см. параметры длины и FPS и профили компрессии.
Улучшение и эффекты: стабилизация, шумоподавление, фон
- Стабилизация: простая —
deshake; более продвинутая — vidstab (если собран в вашей сборке FFmpeg).
ffmpeg -i in.mp4 -vf deshake=rx=32:ry=32:edge=mirror -c:a copy out_stable.mp4
ffmpeg -i in.mp4 -vf "hqdn3d=1.5:1.5:6:6,unsharp=3:3:0.5:3:3:0.0" -c:a copy clean_sharp.mp4
Автоматизация: планировщики, Docker, логирование
- Планирование: cron/systemd (Linux) или Task Scheduler (Windows). Пример cron — «каждые 10 минут сканировать папку и обрабатывать»:
*/10 * * * * /usr/bin/python3 /path/scripts/batch.py >> /path/logs/batch.log 2>&1
- Docker: упакуйте FFmpeg + зависимости; удобно для деплоя на сервер (локальный сервер).
- Мониторинг папок:
watchdog в Python для реактивной обработки новых файлов.
- Логи и метрики: пишите JSON‑логи, собирайте статусы задач, длительность этапов, битрейты; подключите аналитику видео.
- Интеграции: webhooks из вашего CMS, телеграм‑бот для статусов (Telegram‑боты), публикация в соцсети (YouTube, TikTok). См. API/SDK.
Тестирование качества и аналитика
- Валидация параметров (ffprobe):
ffprobe -v error -select_streams v:0 -show_entries stream=width,height,avg_frame_rate,codec_name,pix_fmt -of json out.mp4
- Контроль деградации:
-lavfi ssim/psnr при сравнении исходник ⇒ результат.
- Чек‑лист публикации: субтитры синхронны, громкость нормирована, пик‑уровни не клиппируют, битрейт не занижен, предпросмотр корректный. См. чек‑лист качества.
- Приватность и безопасность: анонимизируйте метаданные, соблюдайте политику данных. См. конфиденциальность и право и безопасность.
Полезные сниппеты FFmpeg
- Кадр‑превью/обложка:
ffmpeg -i in.mp4 -vf "thumbnail,scale=1280:-1" -frames:v 1 cover.jpg (см. обложки).
- Быстрая публикация для веба:
-movflags +faststart.
- Кадровая сетка для сториборда:
-vf "select='not(mod(n,60))',scale=640:-1,tile=5x5".
- Вертикальная кадрировка 9:16:
-vf "crop=in_h*9/16:in_h,scale=1080:1920" (см. вертикальные форматы).
- Шортсы/ри́лс: обрезка + 60 сек, см. Shorts/Reels‑cutter.
Частые ошибки и решения
- Рассинхрон звука: используйте кадр‑точную нарезку (перекодирование) или
-ss после -i с -accurate_seek.
- Конкатенация «в копию»: все дорожки должны совпадать (кодек, профиль, частоты). Иначе — через
filter_complex concat с перекодированием.
- Субтитры не отображаются: проверьте кодировку SRT (UTF‑8) и доступность шрифтов. При burn‑in можно задать
fontsdir.
- VFR⇒CFR: когда требуется постоянный FPS, явное
-r + -vsync 2.
- Windows‑пути и пробелы: используйте кавычки; в Python —
pathlib.
- Производительность: используйте
-preset медленнее для качества, быстрее — для скорости; при наличии GPU — NVENC/VAAPI/QSV.
Короткая памятка по выбору инструмента
| Что сделать |
CLI или Python |
Почему |
| Разовый ререндер 10–20 файлов |
CLI‑одноразовый скрипт |
Быстро и просто |
| Регулярная batch обработка |
Python‑оркестрация |
Логи, ретраи, кэш, API |
| Сложные фильтры + ИИ |
Python + внешние сервисы |
Гибкая интеграция, воспроизводимость |
![Скриншот логов batch‑обработки с прогрессом и метриками]
Вывод и следующий шаг
Python + FFmpeg — это практичный способ построить предсказуемый и расширяемый видеопроцессинг: нарезка и склейка, саб и перевод, конвертация кодеков, компрессия, стабилизация и многое другое. Соберите свой минимальный пайплайн, затем добавьте интеграции и автоматизацию.
Готовы ускорить продакшн? Посмотрите наши готовые пайплайны, примеры API/SDK, автоматизацию авто‑монтажа и ассистентов (ChatGPT‑ассистент, персональный помощник). А для публикации — используйте профили под YouTube, TikTok и Telegram.