
У меня есть фильм mp4 длиной 1:15мин, сделанный камерой Sony Alpha 6400 4k. Его размер 528МБ. Я хочу обрезать его с помощью ffmpeg
. Хотя я обрезал всего несколько секунд, новое видео быломногоменьше. Поэтому я провел несколько тестов с исходным неразрезанным файлом и обнаружил, что сама обработка без каких-либо опций создает гораздо меньшие файлы:
ffmpeg -i C0034.MP4 C0034_ffmpeg.MP4
Выходной файл C0034_ffmpeg.MP4
занимает всего 102 МБ места. Это примерно 1/5 входного файла,безприменяя любые параметры, которые могут уменьшить размер файла, например, меньшее количество кадров в секунду, меньшее разрешение и другие.
Предустановки
В соответствии сдокументация:
Предустановка — это набор параметров, которые обеспечивают определенную скорость кодирования и степень сжатия.
Насколько я понимаю, это сопоставимо спереключение -mx=X
7zip: Более высокий уровень сжатия означает меньшие файлы. Это занимает больше времени, но качество файла не страдает.
По умолчанию ffmpeg — medium. Я изменил его на veryslow
и получил файл размером 83,4 МБ, тогда как тот же файл занимал 149 МБ в ultrafast
. Это заметная разница примерно в 66 МБ от самого сильного до самого слабого сжатия. Но Even ultrafast
все еще на 379 МБ меньше, чем исходный файл, поэтому medium
предустановка по умолчанию, похоже, не объясняет большую часть разницы.
TheПостоянный фактор скорости(ИРФ)
Theта же статья H264 ffmpegпоказывает CRF. Согласно документации, это— рекомендуемый режим управления скоростью для большинства случаев использования.Похоже, это фактор, который используется ffmpeg для определения качества и размера файла.
Диапазон шкалы CRF составляет 0–51, где 0 — без потерь, 23 — значение по умолчанию, а 51 — наихудшее возможное качество.
Поскольку по умолчанию используется 23, технически мы не получаем выходной файл без потерь. Но это также объясняет, почему эти выходные файлы не выглядят хуже входных, хотя они намного меньше:
Считайте, что 17 или 18 — это визуально без потерь или почти без них; они должны выглядеть так же или почти так же, как входные данные, но технически это не так.
Экспериментируя, я пришел к выводу, что CRF влияет на размер файла гораздо больше, чем предустановки (что кажется очевидным, поскольку предустановки отвечают только за сжатие, а CRF — за качество). Я попробовал несколько комбинаций без предустановок (поэтому используются настройки по умолчанию):
-crf 23
~> 102 МБ (по умолчанию)-crf 20
~> 189 МБ-crf 18
~> 285 МБ-crf 17
~> 347 МБ-crf 0
~> 2,64 ГБ
С первых тестов я предполагал выяснить причину: CRF оказывает огромное влияние на размер файла, даже если видимой разницы между 23 и 17 не заметно (по крайней мере, для меня).
НО мне действительно интересно, как -crf 0
(что означает без потерь) почти в 5 раз больше исходного входного файла? Из огромной разницы я предположил, что выходной файл имеет лучшее качество, чем входной файл. Как это возможно? Что делает ffmpeg
выходной файл таким большим?
решение1
Не все кодировщики одинаковы
x264 — это высокоэффективный кодер H.264, то есть он может выводить высококачественный сигнал при более низких скоростях передачи данных. x264 использует замысловатые «психовизуальные» трюки, чтобы обмануть зрение и сэкономить биты, которых может не хватать менее эффективным кодерам.
Кодировщики H.264 на камерах и телефонах должны идти на больше компромиссов из-за других приоритетов (меньше ресурсов, минимально необходимая скорость кодирования, время работы батареи и т. д.). Поэтому, даже если они создают тот же формат, они могут быть крайне неэффективны, что означает, что они не могут сравниться с x264 при том же битрейте.
Настройки по умолчанию для x264 хороши, поэтому обычный пользователь часто не видит разницы в качестве, хотя размер файла может значительно уменьшиться.
Без потерь — это огромно
Настройка -crf 0
использует специальный режим сжатия без потерь. Большинство трюков по уменьшению размера файла не могут быть использованы в режиме без потерь.
Размер входного файла не следует учитывать при работе с lossless. Вход полностью декодируется в несжатое сырое видео: основные строительные блоки видео. Сырое видео без потерь, но имеет самый большой размер файла из всех, потому что оно не сжато. Затем кодер без потерь берет сырое видео и может немного сжать его, но все равно сохранить без потерь. Как ZIP, но разработанный для видео. Меньше, чем сырое видео, но не такой маленький, как ваш типичный H.264 с потерями, потому что он не может использовать все эти модные трюки. Иначе он больше не был бы lossless.
Невозможно создать выход, который имеет лучшее качество, чем вход. Он может быть только ниже или равен по качеству. Независимо от формата или кодировщика.