Как мне ограничить битрейт, чтобы он не превышал скорость исходного файла?

Вопрос или проблема

У меня есть пакет видео из разных источников, которые я хочу уменьшить в размере. Некоторые из них имеют высокое разрешение и высокий битрейт, но некоторые – это клипы с низким битрейтом, полученные через Viber или подобные каналы. Я хочу создать пакетную команду в командной строке, которая берет оригинальный файл и ограничивает его разрешение до 1920×1080 и ограничивает его битрейт до 4096000.

На данный момент я достиг следующей команды:

 "C:\ffmpeg-full\bin\ffmpeg.exe" -i "%~fi" -vcodec libx264 -vf "scale="if(gt(iw,ih),min(iw,1920),-1)":'if(gt(iw,ih),-1,min(ih,1920))'" -b:v 4096000 -b:a 256k -y "d:\tmp2%~pnxi"

Она уменьшает размер кадра, если это необходимо, и заставляет битрейт видео быть 4096000. Это отлично работает для больших файлов с высоким битрейтом, но делает маленькие видео из Viber значительно больше. Есть ли способ ограничить значение битрейта так, чтобы оно не превышало значение битрейта источника? Что-то вроде

-b:v min(ibitrate:4096000)

Я не могу найти ничего подобного на форумах или в Google. Параметр max_rate, похоже, не предназначен для такой задачи.

Ответ или решение

Для ограничения битрейта видеофайлов, который не превышает исходное значение, можно использовать возможности утилиты FFmpeg комплексно с некоторыми хитростями, так как прямого метода, например, -b:v min(ibitrate:4096000), действительно нет. Ниже приведён пошаговый подход к решению вашей задачи.

Шаг 1: Получение исходного битрейта

Сначала вам нужно определить битрейт каждого входного видеофайла. Это можно сделать с помощью FFmpeg, выполнив следующий команды:

"C:\ffmpeg-full\bin\ffmpeg.exe" -i "%~fi" 2>&1 | findstr /c:"bitrate"

Эта команда выдаст строку, в которой будет указано значение битрейта, например bitrate: 1200 kb/s. Вам нужно будет распарсить эту строку, чтобы извлечь фактическое значение битрейта.

Шаг 2: Ввод переменных в команду

Следующий шаг — передать полученное значение в вашу команду FFmpeg и установить битрейт. Для этого вы можете использовать простую конструкцию на командном языке Windows (batch), чтобы получить значение битрейта и использовать его в командной строке.

Вот пример того, как это можно сделать:

@echo off
for %%A in (*.mp4) do (
    rem Получение информации о файле
    for /f "tokens=4" %%B in ('"C:\ffmpeg-full\bin\ffmpeg.exe" -i "%%~A" 2^>^&1 ^| findstr /c:"bitrate"') do (
        set bitrate=%%B
        rem Удаление "kb/s" из строки
        set bitrate=!bitrate:kb/s=!
    )

    rem Проверка, не превышает ли битрейт 4096000
    set /a max_bitrate=4096000
    if !bitrate! LSS !max_bitrate! (
        set target_bitrate=!bitrate!
    ) else (
        set target_bitrate=!max_bitrate!
    )

    rem Команда для преобразования видео
    "C:\ffmpeg-full\bin\ffmpeg.exe" -i "%%~A" -vcodec libx264 -vf "scale=if(gt(iw,ih),min(iw,1920),-1):if(gt(iw,ih),-1,min(ih,1920))" -b:v !target_bitrate! -b:a 256k -y "d:\tmp2\%%~nA_converted.mp4"
)

Шаг 3: Тестирование и отладка

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

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...