Идеальное решение: сократить количество повторяющихся очень похожих кадров и сохранить вывод с (пиковой) переменной частотой кадров.

Идеальное решение: сократить количество повторяющихся очень похожих кадров и сохранить вывод с (пиковой) переменной частотой кадров.

Вместо того, чтобы предоставлять фиксированную частоту кадров для FFMPEG/libx264 (-r/-framerate), я хотел бы указать переменную частоту кадров с МАКСИМАЛЬНЫМ значением и позволить libx264 понижать частоту кадров по своему усмотрению. Идея здесь в том, чтобы получить дополнительное сжатие, когда есть что-то вроде расширенного неподвижного кадра (что происходитМНОГОв моих исходных видео).

Я понимаю, что предиктивный или двунаправленный кадр MPEG сжимается очень хорошо, но также возможно, что исходная частота кадров меньше той, в которую я собираюсь перекодировать (что может привести к БОЛЬШЕМУ потоку!).

решение1

Разочарован тем, что вы тоже не нашли ответа, я собирался хотя бы ответить на вопросы других людей о том, как включить VFR (не VБR) вывод из FFMPEG.

Ответ на это — странно названная -vsyncопция. Вы можете установить несколько различных опций, но та, которая вам нужна, это '2' или vfr. Из страницы руководства:

-vsync параметр
Метод синхронизации видео. Для обеспечения совместимости старые значения могут быть указаны как числа. Новые значения должны быть всегда указаны как строки.

  • 0, сквозной

    • Каждый кадр передается с меткой времени от демультиплексора к мультиплексору.
  • 1, см.

    • Кадры будут дублироваться и отбрасываться для достижения именно требуемой постоянной частоты кадров.
  • 2, ПВП

    • Кадры передаются вместе со своей временной меткой или отбрасываются, чтобы предотвратить появление двух кадров с одинаковой временной меткой.
  • уронить

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

    • Выбирает между 1 и 2 в зависимости от возможностей мюксера. Это метод по умолчанию.

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

С помощью -map вы можете выбрать, из какого потока следует брать временные метки. Вы можете оставить видео или аудио без изменений и синхронизировать оставшийся поток(и) с неизмененным.

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

Вам просто нужно объединить -vsync 2опцию с -r $maxfpsопцией, конечно, где вы заменяете $maxfpsна максимальную частоту кадров, которую вы хотите! И это РАБОТАЕТ! Это не дублирует кадры из исходного файла, но это отбрасывает кадры, которые заставляют файл превышать максимальную частоту кадров!

По умолчанию это -r $maxfpsсамо по себе приводит к дублированию/отбрасыванию кадров для достижения постоянной частоты кадров и -vsync 2к непосредственному извлечению кадров без реального влияния на значения PTS.

Я не был настроен оптимистично, потому что я уже знал, что это -r $maxfpsставит его на постоянную частоту кадров. Я честно ожидал ошибки или того, что он просто подчинится тому, что произойдет первым или последним, или что-то еще. Тот факт, что он делает именно то, что я хотел, делает меня весьма довольным разработчиками FFMPEG.

Надеюсь, это поможет вам или кому-то другому в будущем, если вам больше не нужно это знать.

решение2

Я хотел бы указать переменную частоту кадров с МАКСИМАЛЬНЫМ значением и позволить libx264 понижать частоту кадров по своему усмотрению. Идея здесь в том, чтобы получить дополнительное сжатие, когда есть что-то вроде расширенного неподвижного кадра

По моему мнению, это возможно сделать сравнительно неуклюжим способом, но нежелательно по некоторым сложным и нелогичным причинам.

Несмотря на то, что поток x264 имеет частоту кадров, частота кадров — это скорее проблема уровня контейнера, чем кодека.

При сквозном кодировании VFR по сути будет текстовый файл, в котором подробно описывается частота кадров в определенные кадры/время, а при кодировании источника функция вроде tcfile-in или tcfile-out передает временные метки в кодировку, чтобы сопоставить местоположения частоты и сохранить субъективно стабильное видео от источника.

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

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

Это означает, что вам, вероятно, придется вручную переписывать битрейт (т.е. временные метки медленных сцен, объединенных в файл) или прибегнуть кАлгоритм прореживания кадров, такой как dup, dedup и exactDedup для avisynth. Если в вашем видео очень мало движения, некоторые кадры (даже половина?) будут выброшены. Проблема в том, что эти алгоритмы не продвинуты и не делают хорошего выбора с кадрами «реальной жизни» относительно того, что будет способствовать лучшему кодированию.

Кроме того, удаление кадров, содержащих такие элементы, как I- и B-кадры, со временем уменьшает количество доступных деталей, из-за чего движение выглядит «ступенчатым», что может мешать другим основным параметрам видео и вызывать артефакты, такие как алиасинг.

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

И наконец, причина, по которой не так много вариантов сделать то, что вам нужно, заключается в том, что x264 действительно хорош в управлении битрейтом, просто используя временное сжатие (запись изменений в частичных кадрах). Переход на 1/2 частоты кадров не сократит размер файла вдвое; 10% — это, вероятно, реалистичный выигрыш, которого можно ожидать от малоподвижных или анимированных файлов.

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

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

Вывод таков: трата времени на оптимизацию множества настроек битрейта даст гораздо больше в плане управления размером файла и улучшит качество вашего видео, а не вызовет осложнений с небольшим выигрышем. Сохранение исходного FPS, вероятно, является лучшей идеей, если вы не нацелены на стандарты вещания или медиа. Плееры хорошо спроектированы для обработки различных битрейтов (в отличие от NLE) — и чем больше кадров в вашем видео, тем плавнее воспроизведение и, возможно, тем меньше размер файла из-за меньших изменений в движении между кадрами.

Вот подборка ссылок на информацию о стандартах и ​​обсуждения на форумах, которые должны помочь разобраться в этом запутанном аспекте кодирования:

-инструменты децимации avisynth

-переключатели fps и -r
-x264 Общие (tcfile, fps)
-стандарты файлов таймкода
-Уровни и профили
-Краткое и понятное описание настроек CFR/VFR (раздел «частота кадров»)

doom9, videohelp и т.д. теоретические обсуждения
1 2 3 4 5 6 7

решение3

Идеальное решение: сократить количество повторяющихся очень похожих кадров и сохранить вывод с (пиковой) переменной частотой кадров.

  • Для контента с длинными неподвижными сценами удаление повторяющихся кадров может динамически и существенно снизить частоту кадров, что позволит добиться большего уменьшения размера файла, чем когда-либо может обеспечить кодек и его внутрикадровое сжатие!
  • В моем примере:
    • 100% оригинальный размер файла mezzanine при 60 FPS
    • 15% CR28 при постоянной частоте кадров 60 FPS
    • 6% CR28 при пиковой частоте кадров 60 FPS (почти в 3 раза больше!)

Оригинал доступен

ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 screen-recording-vfr.mp4

Перекодировать уже сжатое видео в динамическую частоту кадров без повторного кодирования

ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated-without-reencoding.mp4

В деталях

Оригинал доступен

ffmpeg -i screen-recording.mov -movflags faststart -c:v libx264 -vf mpdecimate -vsync vfr -r 120 -preset veryslow -crf 24 "screen-recording-vfr.mp4"

-i video-mezzanine.mov   Original or your high quality rendered export as the input file.
-movflags faststart      Streaming ready by putting the moov atom to the file start.
-c:v libx264             H-264 codec
-vf mpdecimate           Drop frames not differing greatly from previous frame to reduce frame rate.
-vsync vfr               Output as variable frame rate (vfr)! Necessary sister option to 'mpdecimate'.
                         - To maintain the playback speed while benefitting from the file size reduction.
-r 30                    If you specify -r then in this combo it serves as the peak framerate!
                         I recommend to omit this option:
                         - Then the peak framerate IS the peak/constant rate of the source.
                         - Which preserves dynamic scenes fully and compresses long still sequences.
                         - So the best of both aspects.
                         - State a peak FPS if loosing FPS in dynamic scenes
                           is acceptable for the reduction in file size.
-crf 24                  - Constant Rate Factor (constant quality at variable bitrate)
-preset veryslow         - Quality effort put into the encoding
screen-recording-vfr.mp4 - Output file

Конвертировать уже экспортированное видео в динамическую частоту кадров без повторного кодирования

ffmpeg -i video-export-old.mp4 -vf mpdecimate -vsync vfr video-export-mpdecimated.mp4

  • Это операция без потерь. Перекодирование с потерями не происходит, только переупаковка/перессылание.

  • Он удалит столько дубликатов кадров, сколько сможет!

Пример:

  • Слайд-шоу всего из 3 неподвижных изображений без переходов * каждое продолжительностью 5 секунд * со скоростью 50 кадров в секунду = 750 кадров

  • ffmpegдействительно сократит его до 3 кадров при 1/5 (=0,2) FPS! Подтверждено mediainfo!

Анализ и обучение

  • В видеороликах с длинными неподвижными сценами можно значительно уменьшить количество кадров и размер файла!
  • Для обоих сценариев
    • Кодирование из промежуточного файла с тем же CFR сохраняет визуальное качество
      • Но уменьшение размера файла при переходе от постоянной частоты кадров к переменной составляет от 15% до 6%.
    • Уменьшение частоты кадров без перекодирования дает меньшее уменьшение размера файла, но все же:
      • Уменьшает размер файла (на 15–10%).
screen-recording.mov
- Frame rate mode: Variable
- Frame rate: 58.628 FPS
- Minimum frame rate: 30.000 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 732                100 %
- Size: 1675084 bytes             100 %

screen-recording CR24 fps 60.mp4
- Frame rate mode: Constant
- Frame rate: 60.000 FPS
- Frame count: 750                102 %
- Size: 255863 bytes               15 %

screen-recording CR24 mpdecimated vfr.mp4
- Frame rate mode: Variable
- Frame rate: 17.398 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS
- Frame count: 214                 29 %
- Size: 101860 bytes                6 %


screen-recording CR24 mpdecimated fps 30 max.mp4
- Frame rate mode: Variable
- Frame rate: 11.078 FPS
- Minimum frame rate: 1.154 FPS
- Maximum frame rate: 30.000 FPS
- Frame count: 137                 17 %
- Size: 94382 bytes                 5.6

screen-recording CR24 mpdecimated vfr without re-encoding faststart.mp4
- Frame rate mode: Variable
- Frame rate: 19.974 FPS
- Minimum frame rate: 1.132 FPS
- Maximum frame rate: 60.000 FPS  
- Frame count: 247                 33 % 
- Size: 165 KB (164947 bytes)      10 %


Связанный контент