Почему ffmpeg увеличивает размер файла?

552
karpo518

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

Я хочу использовать видео для показа онлайн на моем сайте. Я использую вызов ffmpeg ниже

ffmpeg input.mp4 -c:v libx264 -preset placebo -crf 0 -c:a aac -movflags faststart output.mp4 

PS Я добавлю сюда пример ошибок. Даже если я попаду сюда, я хочу понять, почему ffmpeg увеличивает мои файлы. Я сталкиваюсь с этим регулярно. Это главный вопрос.

[h264 @ 0x56524c25dea0] Invalid NAL unit 0, skipping. [h264 @ 0x56524c25dea0] error while decoding MB 32 2, bytestream -7 [h264 @ 0x56524c216260] Invalid NAL unit 0, skipping. [h264 @ 0x56524c216260] error while decoding MB 46 16, bytestream -5 [h264 @ 0x56524c25dea0] Invalid NAL unit 8, skipping. [h264 @ 0x56524c25dea0] error while decoding MB 36 1, bytestream -13 [aac @ 0x56524c1e6ea0] Number of bands (57) exceeds limit (44). Error while decoding stream #0:1: Invalid data found when processing input [aac @ 0x56524c1e6ea0] channel element 3.10 is not allocated Error while decoding stream #0:1: Invalid data found when processing input ... [aac @ 0x56524c1e6ea0] Number of bands (48) exceeds limit (44). Error while decoding stream #0:1: Invalid data found when processing input [aac @ 0x56524c1e6ea0] Error decoding AAC frame header. Error while decoding stream #0:1: Error number -50531338 occurred [aac @ 0x56524c1e6ea0] Input buffer exhausted before END element found Error while decoding stream #0:1: Invalid data found when processing input [aac @ 0x56524c1e6ea0] decode_pce: Input buffer exhausted before END element found Error while decoding stream #0:1: Invalid data found when processing input [null @ 0x56524c1e7d20] Application provided invalid, non monotonically increasing dts to muxer in stream 1: 12351488 >= 12350464 [null @ 0x56524c1e7d20] Application provided invalid, non monotonically increasing dts to muxer in stream 1: 12351488 >= 12351488 
0
Какие «ошибки кодирования» вы пытаетесь исправить? Если размер важнее всего, почему бы не оставить его как есть, или снизить качество или уменьшить его? Xen2050 6 лет назад 1
Я добавил это. Тогда у меня есть 2 вопроса: 1. Почему ffmpeg увеличивает размер файла для всех случаев с одинаковым качеством? 2. Как я могу исправить ошибки в моем случае? Когда я кодирую файл из одного формата в другой, я получаю побочный эффект в виде потери качества или увеличения размера. Я могу принять этот факт. Но! Если я закодирую файл в том же формате в его исходном качестве, почему его размер увеличивается. Что это за хитрость? ffmpeg говорит, что здесь тот же файл, но больше, так как у вас нет ничего, что могло бы занять жесткий диск. Это не нормально! karpo518 6 лет назад 0
Не добавляйте ваш фактический вопрос в комментариях к вашему вопросу. Если вы измените формат, ожидается, что что-то изменится, поскольку вам, вероятно, потребуется перекодировать файл. Проверьте свойства обоих файлов, чтобы проверить, когда они на самом деле одинаковы. Seth 6 лет назад 0

1 ответ на вопрос

2
adenzila

Почему перекодированное видео в несколько раз больше входного файла?

Вы заставляете кодировщик использовать настройку качества видео без потерь с -crf 0. Это приводит к тому, что ваше выходное видео будет намного больше входного (при условии, что ваше входное видео закодировано с настройкой с потерями).

Настройка без потерь сильно ограничивает возможности сжатия кодера. Говоря простым языком: высокая производительность сжатия, достигаемая большинством видеокодеков, таких как x264, достигается за счет кодирования видео с потерями, которое пытается сохранить «воспринимаемое» качество, одновременно избавляясь от незначительно воспринимаемых данных.

Как кодировать MP4 видео без потери качества и увеличения размера файла?

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

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

Похожие вопросы