[windows] .bat-файл для перекодировки в кодеки av1 и opus c помощью ffmpeg

Подготовка к работе

Для работы скриптов необходимо наличие утилит FFmpeg и FFprobe в вашей системе.

  1. Скачайте архив сборки full (в сборке essentials нет кодека libsvtav1):
    скачать FFmpeg (сборка full)
  2. Извлеките файлы ffmpeg.exe и ffprobe.exe (они находятся в папке bin внутри архива).
  3. Переместите оба файла в системную папку C:\Windows (потребуются права администратора).

Это позволит запускать процесс транскодирования простым перетаскиванием видеофайлов на ваш .bat файл из любого места на компьютере.

Инструкция по автоматизации транскодирования видео в формат AV1

Ниже представлен программный код пакетного файла (.bat) для операционных систем Windows, предназначенный для автоматизированной обработки видеофайлов с использованием библиотеки FFmpeg. Данный скрипт реализует последовательное сжатие видео в высокоэффективный формат AV1 с сохранением оригинальных параметров аудио в кодеке Opus.

Данная команда транскодирования выполняется силами вашего процессора (CPU). Кодек libsvtav1 эффективно распределяет нагрузку на все доступные ядра и потоки. Чем современнее и многопоточнее ваш процессор, тем быстрее завершится обработка. Использование CPU вместо видеокарты в данном случае оправдано максимально возможным качеством при минимальном весе выходного файла.

Исходный код скрипта

Cохранить в кодировке UTF-8 (без BOM).

@echo off
chcp 65001 >nul

:loop
if "%~1"=="" goto end
echo Обработка файла: "%~nx1"
ffmpeg -y -i "%~1" -c:v libsvtav1 -preset 5 -crf 28 -pix_fmt yuv420p10le -svtav1-params tune=0 -c:a libopus -b:a 128k "%~dpn1.mp4.mp4"
shift
goto loop

:end
echo Всё завершено!
pause

Техническое описание параметров FFmpeg в скрипте


Рекомендации по выбору параметров:

В представленном выше коде используются настройки для получения максимального качества. Если вы хотите адаптировать скрипт под своё железо или задачи, обратите внимание на следующие параметры:

Универсальный вариант скрипта (баланс скорости и сжатия)

Если ваш процессор загружен на 100%, а время кодирования исчисляется десятками часов, или же итоговый файл получается слишком тяжёлым, используйте данный вариант настроек. Он оптимизирован для быстрой работы на большинстве современных ПК и ноутбуков:

Cохранить в кодировке UTF-8 (без BOM).

@echo off
chcp 65001 >nul

:loop
if "%~1"=="" goto end
echo Обработка файла: "%~nx1"
ffmpeg -y -i "%~1" -c:v libsvtav1 -preset 6 -crf 35 -pix_fmt yuv420p10le -svtav1-params tune=0 -c:a libopus -b:a 128k "%~dpn1_av1.mp4"
shift
goto loop

:end
echo Всё завершено!
pause

Основные отличия этого варианта:

Вариант для точного сжатия файла до 360 МБ (двухпроходный)

Если вам требуется сжать видео строго под конкретный лимит (например, 360 МБ) с сохранением максимального качества, используйте этот умный скрипт. Он автоматически запрашивает длительность видео, вычисляет идеальный битрейт за вычетом аудиодорожки и запускает двухпроходное кодирование.

Сохранить в кодировке UTF-8 (без BOM).

@echo off
setlocal enabledelayedexpansion
chcp 65001 >nul

if "%~1"=="" (echo Перетащите видео прямо на батник! & pause & exit /b)
set "INPUT=%~1"
cd /d "%~dp1"
set "OUTPUT=%~dpn1_av1_360mb.mp4"

for /f "tokens=1 delims=." %%a in ('ffprobe -v error -show_entries format=duration -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT%"') do set "DUR=%%a"
if "%DUR%"=="" (echo Ошибка определения длительности & pause & exit /b)

set TARGET_MB=350
set /a TOTAL_KBITS=TARGET_MB * 8192, TOTAL_BITRATE=TOTAL_KBITS / DUR, VIDEO_BITRATE=TOTAL_BITRATE - 128
if %VIDEO_BITRATE% lss 50 (echo Видео слишком длинное для лимита 360 МБ & pause & exit /b)

ffmpeg -y -i "%INPUT%" -c:v libsvtav1 -preset 8 -b:v %VIDEO_BITRATE%k -pix_fmt yuv420p10le -svtav1-params tune=0 -pass 1 -an -f null NUL
ffmpeg -y -i "%INPUT%" -c:v libsvtav1 -preset 8 -b:v %VIDEO_BITRATE%k -pix_fmt yuv420p10le -svtav1-params tune=0 -pass 2 -c:a libopus -b:a 128k "%OUTPUT%"

del ffmpeg2pass-0.log 2>nul & del ffmpeg2pass-0.log.mbtree 2>nul
echo Всё готово! Результат сохранён в "%OUTPUT%"
pause

Вариант для точного сжатия до 360 МБ силами видеокарты (NVIDIA GPU)

Если ваша система оснащена современной видеокартой NVIDIA (серии 40 или 50), вы можете использовать аппаратный чип NVENC для молниеносного сжатия видео под конкретный размер. Этот метод идеально подходит для подготовки выпусков шоу или блогов, которые нужно встроить в HTML-страницы или отправить через сервисы с лимитом по весу.

В отличие от процессора, видеокарта выполняет глубокий анализ сцен прямо во время кодирования, что позволяет избежать длинных двухпроходных очередей.

Cохранить в кодировке UTF-8 (без BOM).

@echo off
setlocal enabledelayedexpansion
chcp 65001 >nul

if "%~1"=="" (echo Перетащите видео прямо на батник! & pause & exit /b)
set "INPUT=%~1"
cd /d "%~dp1"
set "OUTPUT=%~dpn1_av1_360mb_gpu.mp4"

for /f "tokens=1 delims=." %%a in ('ffprobe -v error -show_entries format=duration -of default^=noprint_wrappers^=1:nokey^=1 "%INPUT%"') do set "DUR=%%a"
if "%DUR%"=="" (echo Ошибка определения длительности & pause & exit /b)

set TARGET_MB=350
set /a TOTAL_KBITS=TARGET_MB * 8192, TOTAL_BITRATE=TOTAL_KBITS / DUR, VIDEO_BITRATE=TOTAL_BITRATE - 128, BUF_SIZE=TOTAL_BITRATE * 2
if %VIDEO_BITRATE% lss 50 (echo Видео слишком длинное для лимита 360 МБ & pause & exit /b)

ffmpeg -y -i "%INPUT%" -c:v av1_nvenc -preset p6 -multipass fullres -rc vbr -b:v %VIDEO_BITRATE%k -maxrate %TOTAL_BITRATE%k -bufsize %BUF_SIZE%k -pix_fmt p010le -c:a libopus -b:a 128k "%OUTPUT%"
echo Всё готово! Результат сохранён в "%OUTPUT%"
pause

Пакетное транскодирование силами видеокарты (NVIDIA NVENC)

Если вам нужно обработать видео максимально быстро, используйте аппаратное ускорение вашей видеокарты NVIDIA. Современные карты (начиная с 40-й и 50-й серии, как ваша RTX 5060 Ti) поддерживают аппаратное кодирование AV1, что позволяет сжимать видео почти мгновенно.

Сверхбыстрое кодирование AV1 (NVIDIA)

Этот скрипт использует кодек av1_nvenc. Он работает в десятки раз быстрее, чем процессор, при этом выдаёт отличную картинку.

Сохранить в кодировке UTF-8 (без BOM).

@echo off
chcp 65001 >nul

:loop
if "%~1"=="" goto end

echo Обработка через GPU (NVIDIA): "%~nx1"

ffmpeg -y -i "%~1" -c:v av1_nvenc -preset p6 -cq 32 -b:v 0 -pix_fmt p010le -c:a libopus -b:a 128k "%~dpn1_gpu.mp4"

shift
goto loop

:end
echo Всё! Видеокарта справилась без ошибок.
pause

Технические параметры для GPU: