Снижение битрейта с помощью ffmpeg с помощью `-b:v 500k` фактически не снижает битрейт до 500k

Я пытаюсь создать несколько более ранних версий видеофайла с помощью ffmpeg. Я использую следующую команду через командную строку (команда взята из документации):

ffmpeg -i ../../tos.avi -b:v 500k tos_500k.avi

Я пытаюсь сделать это с несколькими значениями ниже 2000 кбит / с (до ~125 кбит / с), однако нижний предел, который фактически получается при проверке сгенерированных видеофайлов, составляет около 2000 кбит / с. Я проверяю значения с помощью программного обеспечения videospec.

  1. У кого-нибудь есть идея, почему дальнейшее снижение битрейта не оказывает никакого влияния?
  2. Можете ли вы дать мне подсказку, как эффективно снизить битрейт видео до заданного уровня?

[EDIT] Чтобы быть более точным, мое оригинальное видео имеет разрешение 1920x1080 с битрейтом около 15 Мбит / с. Используя вышеупомянутую команду, я могу без проблем понизить ее до больших битрейтов, таких как 8000, 5000, до 2000 кбит / с. Тем не менее, все, что ниже 2000, похоже, не обрабатывается, в результате выходные файлы всегда застревают с битрейтом чуть более 2000 кбит / с. (Размер файла также очень близок к файлу, который был успешно уменьшен до 2000 кбит / с.)

1 ответ

Решение

При перекодировании файла вы не должны просто указывать битрейт. Я предполагаю, что ffmpeg пытается использовать кодек mpeg4 по умолчанию и отказывается использовать менее 2 Мбит / с, потому что он просто не может опуститься ниже с таким высоким разрешением.

Я предлагаю вам перекодировать с помощью кодека H.264, который вы можете сделать следующим образом:

ffmpeg -i ../../tos.avi -c:v libx264 -b:v 500k tos_500k.mp4

Тем не менее, обратите внимание, что при этом будет использоваться метод средней скорости передачи данных за 1 проход, что довольно плохо для качества. Вместо этого вам следует попробовать кодирование с "коэффициентом постоянной скорости", то есть вы выбираете определенное качество, и кодировщик решает, какой средний битрейт является лучшим для вашего файла:

ffmpeg -i ../../tos.avi -c:v libx264 -crf 23 tos_500k.mp4

Вы можете экспериментировать со значением crf. Увеличение его будет означать более низкий битрейт и худшее качество, а наоборот - снижение.

Если вы абсолютно хотите нацелить на среднюю скорость передачи данных, вы должны проверить 2-проходное кодирование. Также не забывайте про пресеты!

Как примечание: 500k для 1080p слишком мало, и вы получите плохие результаты. Если вы хотите использовать такой низкий битрейт, я советую уменьшить его до 480p (854x480). 720p должен иметь битрейт не менее 1,5 Мбит / с и 3 Мбит / с 1080p.

Для ваших будущих вопросов, не забудьте опубликовать журналы ввода / вывода из ffmpeg, они всегда полезны:-) .

500K недостаточно для разрешения 1080p накануне на H264 или H265 у вас будет плохое качество изображения, так как их недостаточно для заполнения большого размера кадра, так как @Ely отметим, что вы должны указывать кодировщик тоже, даже я думаю, что последняя версия ffmpeg по умолчанию использует h264, если вы указываете расширение файла как.mp4. Ваша команда конвертирования должна выглядеть так:

ffmpeg -i ../../tos.avi -s 640x360 -v:c libx264  -b:v 500k tos_500k.mp4 

и если вы хотите больше сжатия и торговли с наилучшим возможным качеством для размера использования crfConstant Rate Factor с двухпроходным методом преобразования, поскольку он будет пытаться распределить битрейт в соответствии с состоянием каждого кадра (движущаяся быстрая сцена), получит больший битрейт.

ffmpeg -y -i  ../../tos.avi  -s 640x360  -c:v libx264 -crf 23 -pass 1 -c:a aac -f mp4 /dev/null && \
       ffmpeg -i  ../../tos.avi  -s 640x360  -c:v libx264 -crf 23  -pass 2 -c:a aac tos_500k.mp4

если вы все еще не удовлетворены размером файла, увеличивайте значение crf, пока не достигнете ~27

Другие вопросы по тегам