У меня есть большой набор jpgs, которые я хочу преобразовать в видео без потерь (или, по крайней мере, очень близко к без потерь, если время кодирования не намного больше, чем в противном случае).
Наивно, я думаю, что должен быть какой-то кодек, который может хранить каждый отдельный кадр jpg как есть (без повторного сжатия) и, возможно, добиться некоторого хорошего сжатия, заменив некоторые кадры только информацией о дельте из предыдущего кадра. В моем случае есть много последовательностей кадров, которые идентичны друг другу или имеют небольшую разницу между ними.
Есть ли какой-то кодек и подходящие настройки для ffmpeg, которые могут этого добиться?
Ответы:
Просто смешайте изображения
Вы можете просто смешать изображения JPG, чтобы сделать видео:
Обратите внимание, что если вы пропустите это,
-framerate
то по умолчанию-framerate 25
будет применяться к входу.Оптимизация без потерь
Вы можете использовать
jpegtran
оптимизацию без потерь для каждого кадра, что может обеспечить значительную экономию размера файла:Теперь добавьте,
ffmpeg
как показано выше.Проверка, что это на самом деле без потерь
Framehash мультплексор может быть использован для сравнения уникального хэша каждого кадра , чтобы гарантировать , что результат действительно без потерь:
В приведенных выше примерах каждый связанный кадр для ввода и вывода совместно использует один и тот же хеш, гарантируя, что кадры идентичны и что выходной сигнал не имеет потерь.
Также см
источник
framemd5
должны достичь две команды, помимо простого перечисления хэшей? как получить дополнительное сжатие, если идентифицированы идентичные кадры?Это выведет видео H.264 без потерь, где кадры будут использовать информацию из других кадров
ffmpeg -f image2 -r 30 -i %09d.jpg -vcodec libx264 -profile:v high444 -refs 16 -crf 0 -preset ultrafast a.mp4
Объяснение вариантов:
-f image2
- говорит ffmpeg выбрать группу изображений-r 30
- говорит ffmpeg кодировать со скоростью 30 кадров (или изображений) в секунду (измените это на желаемую частоту кадров)-i %09d.jpg
- сообщает ffmpeg использовать изображения от 000000000.jpg до 999999999.jpg в качестве входных данных. Измените значение9
in%09d.jpg
на количество нулей в именах последовательности изображений. Если ваши имена файлов, например, img0001.jpg, то это будет выражаться как img% 04d.jpg-vcodec libx264
- сообщает ffmpeg для вывода в файл, совместимый с H.264-profile:v high444
- говорит libx264 использовать прогнозируемый профиль High 4: 4: 4 High Lossless, позволяя кодировать без потерь-refs 16
- сообщает libx264, что в буфере должно храниться 16 изображений, чтобы на них могли ссылаться другие изображения в видео-crf 0
- говорит libx264 выполнить кодирование без потерь-preset ultrafast
- говорит libx264 расставить приоритеты скорости кодирования над размером выходного файлаa.mp4
- сообщает ffmpeg сохранить выходные данные в файле MP4 с именем a.mp4. Измените это на имя файла и формат, который вы хотите использоватьисточник
-f image2
здесь лишнее. Файл изображения демультиплексора следует использовать-framerate
вместо-r
. libx264 автоматически выберет подходящее-profile
для без потерь, и-preset
будет иметь дело с-refs
.-refs 5
в большинстве случаев, если вы не знаете, что в вашем контенте есть идентичные изображения, разделенные несколькими другими, это может привести к тому, что x264 потеряет ссылку, прежде чем попадет в дубликат. Выше, чемultrafast
немного отличается в режиме без потерь, за исключением выигрыша CABAC в ~ 10% по сравнению с CAVLC (для высокой стоимости процессора при битрейтах, необходимых для без потерь). Серьезно, на некоторых живых действиях 720x480p60 (выход деинтерлейса),superfast
было 28 ГБ,slower
было 27 ГБ. Если время кодирования не имеет значения, но время декодирования имеет значение, убедитесь, что вы избегаете CABAC. Возможно даже-tune fastdecode
. Умеренное количество ссылок не должно быть больно.-preset placebo
несколько дополнительных долей процента.-vcodec libx265 -x265-params lossless=1
это эквивалентный вариант. (Но по моему опыту (= запись презентаций Powerpoint в виде слайд-шоу), это не обязательно лучше, и это намного медленнее, чем h264) Настройтесь на следующий год AOMedia AV1 / IETF - NETVC1 / Xiph's Daala / что бы там ни было, он будет переименован к тому времени ... режим без потерьВы можете создать
avi
анимацию в виде серииpng
изображений (png
это без потерь , так чтоjpeg => png
преобразование не должно ухудшать свои фотографии):если ваши изображения по имени
img_0001.jpg
где «25» - это частота кадров, которую вы хотите получить в полученном видео.
-start_number
не требуется, если оно равно 1, но полезно, если ваш первый номер видео не равен 1.Если вы хотите закодировать
mjpeg
с высочайшим качеством командной строки:И прелесть в том, что вы можете конвертировать видео обратно в серию картинок:
так далее...
источник
Чтобы расширить ответ LordNeckbeard, просто добавьте данные JPEG в видеопоток MJPEG. Это будет наименьшее представление точной последовательности выходных изображений, даже несмотря на то, что по современным стандартам MJPEG является ужасно неэффективным кодеком. (нет временной избыточности и даже нет внутреннего предсказания.
Вы можете создать MJPEG-видео с переменной частотой кадров, чтобы использовать дубликаты изображений на входе.
Хм, это не сработает, поскольку mpdecimate не будет работать со сжатыми данными, и мы не можем позволить ffmpeg декодировать, а затем повторно записать данные изображений без потерь и затрат на процессор.
Может быть, если вы замените дубликаты исходных файлов jpg пустыми файлами с этим порядковым номером, или что-то еще?
Поскольку этот вопрос даже не недавний, я не собираюсь тратить время на то, чтобы понять, как это сделать, если кто-то не ответит, чтобы спросить, как это сделать. Но так как MJPEG может входить в контейнер mkv, я уверен, что возможно иметь файл, который не дублирует данные jpeg для повторяющихся кадров, но вместо этого просто не имеет выходного кадра для декодирования, пока последовательность дубликатов не будет над.
О, вот идея:
Затем удалите (или переместите в сторону) все jpegs для кадров, которые mpdecimate хочет отбросить (возможно, у него есть некоторые параметры ведения журнала? Или -vf showinfo, и проанализируйте его, и переместите или жестко связывайте только кадры, которые отображаются в его выходных данных, оставляя позади упал JPEG?). Примените это к MJPEG.mkv, затем сделайте что-нибудь с mkvmerge, чтобы заменить временные метки кадра в этом на временные метки из
mpdecimate.timestamps
.Если бы вы использовали xcoding вместо простого преобразования данных jpeg в MJPEG, это было бы НАМНОГО проще, поскольку вы просто использовали бы мою первую команду с mpdecimate и любым другим кодеком, кроме
copy
, и это было бы просто Work (tm).Я не пробовал ничего из этого, так как это был старый вопрос. Также причина, по которой я не заполнил пробелы в том, как на самом деле фильтровать ваш каталог jpegs на основе вывода mpdecimate, или как на самом деле использовать поток меток времени.
источник