ffmpeg перекодирует libx264 без потери качества?

Согласно документации для кодирования libx264 (h264), мы можем использовать пресет: очень быстрый, быстрый, быстрый, средний, медленный и т. д. https://trac.ffmpeg.org/wiki/Encode/H.264

...для кодирования постоянного качества вы просто сэкономите битрейт, выбрав более медленный пресет.

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

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

Кто-нибудь когда-либо делал это или знает, как это можно сделать?

Я не понимаю, зачем вам сжимать и повторно сжимать - если «медленный» дает вам размер и качество, которые вы хотите, зачем делать это в два этапа? Как вы думаете, что вы получите от первоначального «очень быстрого» шага?
@JimMack Почему вы предполагаете, что мы сжимаем новые или оригинальные видео? У нас есть сотни старых видео, которые были созданы с менее оптимальным сжатием, и сейчас было бы хорошо уменьшить их размер.

Ответы (2)

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

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

Мне любопытно, что это за специализированные кодеки, о которых вы говорите? Я никогда не видел кодек с потерями, который не пропускал бы больше информации при повторном сжатии с той же кодировкой.
@ProfessorSparkles - я забыл, что именно, я даже не уверен, что они используются для видео, и это ограниченное количество вещей, которые вы можете делать без дальнейшей потери качества. Я попытаюсь немного покопаться, чтобы найти их снова. Я знаю, что они не очень часто используются, потому что сжатие не так хорошо, но я знаю, что они существуют.
Важным термином является идемпотентность . По-видимому, некоторые реализации JPEG и JPEG-2000 действительно выполняют это для определенных повторных компрессий. Ни один алгоритм не делает это в 100% случаев, о которых я знаю, но некоторые могут делать это некоторое время.

Просто чтобы добавить немного к правильному ответу AJ Henderson. Вы можете сжимать без потерь с помощью h264, это прогностический профиль без потерь, который достигается путем кодирования с настройкой CRF, равной 0.

Хотя таким образом вы получаете сжатие h264 без потерь, вы получите файл большего размера, чем исходный файл. Сжатие с потерями не может быть выполнено дважды без потери дополнительной информации с каждой итерацией, оно уже говорит о том, что само по себе, его «с потерями», оно теряет информацию каждый раз, когда вы кодируете его, следовательно, только кодирование без потерь сохранит всю информацию, и это CRF 0 (который создает огромные файлы).

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

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