%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D1%87%D0%B0%D1%81%D1%82%D0%BE%D1%82%D0%BE%D0%B9%20%D0%BA%D0%B0%D0%B4%D1%80%D0%BE%D0%B2..png)
Вместо того, чтобы предоставлять фиксированную частоту кадров для 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%).
- Кодирование из промежуточного файла с тем же CFR сохраняет визуальное качество
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 %