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

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

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

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

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

скачать ffmpeg

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

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

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

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

Cохранить в кодировке ANSI.

@echo off

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

echo Обработка файла: "%~nx1"

ffmpeg -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охранить в кодировке ANSI.

@echo off

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

echo Обработка файла: "%~nx1"

ffmpeg -i "%~1" -c:v libsvtav1 -preset 6 -crf 35 -pix_fmt yuv420p10le -svtav1-params tune=0 -c:a libopus -b:a 128k "%~dpn1.mp4.mp4"

shift
goto loop

:end
echo Всё! Обработка завершена.
pause

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

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

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

Сохранить в кодировке ANSI.

@echo off
setlocal enabledelayedexpansion

if "%~1"=="" (
    echo Перетащите видеофайл прямо на этот батник!
    pause
    exit /b
)

set "INPUT=%~1"
set "OUTPUT=%~dpn1_av1_360mb.mp4"

:: Получаем длительность видео в секундах через ffprobe
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
)

for /f "delims=0123456789" %%i in ("%DUR%") do (
    echo Ошибка: Длительность видео не является числом.
    pause
    exit /b
)

set TARGET_MB=360
set /a TOTAL_KBITS=TARGET_MB * 8192
set /a TOTAL_BITRATE=TOTAL_KBITS / DUR
set /a VIDEO_BITRATE=TOTAL_BITRATE - 128

if %VIDEO_BITRATE% lss 50 (
    echo Ошибка: Видео слишком длинное для качественного сжатия в 360 МБ.
    pause
    exit /b
)

echo Длительность: %DUR% сек.
echo Вычисленный битрейт видео: %VIDEO_BITRATE%k. Запуск кодирования...

:: Запуск двухпроходного сжатия
ffmpeg -y -i "%INPUT%" -c:v libsvtav1 -preset 8 -b:v %VIDEO_BITRATE%k -pass 1 -an -f mp4 NUL
if errorlevel 1 (
    echo Ошибка при выполнении первого прохода.
    pause
    exit /b
)

ffmpeg -y -i "%INPUT%" -c:v libsvtav1 -preset 8 -b:v %VIDEO_BITRATE%k -pass 2 -c:a libopus -b:a 128k "%OUTPUT%"
if errorlevel 1 (
    echo Ошибка при выполнении второго прохода.
    pause
    exit /b
)

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охранить в кодировке ANSI.

@echo off
setlocal enabledelayedexpansion

if "%~1"=="" (
    echo Перетащите видеофайл на батник!
    pause
    exit /b
)

set "INPUT=%~1"
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=360
set /a TOTAL_KBITS=TARGET_MB * 8192
set /a TOTAL_BITRATE=TOTAL_KBITS / DUR
set /a VIDEO_BITRATE=TOTAL_BITRATE - 128

if %VIDEO_BITRATE% lss 50 (
    echo Ошибка: Видео слишком длинное для 360 МБ.
    pause
    exit /b
)

echo Длительность: %DUR% сек.
echo Вычисленный битрейт для GPU: %VIDEO_BITRATE%k. Запуск...

:: Кодирование через NVIDIA NVENC с двухпроходным анализом внутри прогона
ffmpeg -y -i "%INPUT%" -c:v av1_nvenc -preset p6 -multipass fullres -rc vbr -b:v %VIDEO_BITRATE%k -maxrate %TOTAL_BITRATE%k -bufsize %TOTAL_BITRATE%k*2 -pix_fmt p010le -c:a libopus -b:a 128k "%OUTPUT%"

if errorlevel 1 (
    echo Ошибка при кодировании!
    pause
    exit /b
)

echo Всё готово! Результат сохранён в "%OUTPUT%"
pause

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

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

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

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

Сохранить в кодировке ANSI.

@echo off

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

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

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

shift
goto loop

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

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