Видео без потерь с использованием FFmpeg ffv1 на изображениях в формате JPEG не сжимается, а расширяется

977
user1373984

Возможно ли для FFmpeg / ffv1.3 / mkv создать видео без потерь не больше, чем сумма его частей (и если да, то как), и если нет, то что является хорошей альтернативой, чтобы приблизиться к размеру? Видео должно быть без потерь.

Я пытаюсь использовать FFmpeg для создания mkv с ffv1.3 на множестве похожих jpeg-изображений (изображений с веб-камеры). Я могу создать видео, но оно по крайней мере в 2 раза превышает размер коллекции изображений JPEG. Я бы ожидал примерно такой же уровень сжатия или лучше.

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

Команды, которые я использую для создания файла:

ffmpeg -pattern_type glob -i '* .jpg' -vcodec ffv1 -уровень 3 -an -pass 1 -passlogfile passlog -f matroska / dev / null

ffmpeg -pattern_type glob -i '* .jpg' -vcodec ffv1 -уровень 3 -an -pass 2 -passlogfile passlog -f matroska ~ / foo.mkv

Входные файлы в общей сложности 24M, но результирующий mkv составляет 96M (за du -h).

Результаты второго прохода:

ffmpeg version N-79053-g7eedad9 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 4.6 (Debian 4.6.3-14+rpi1) configuration: --enable-cross-compile --cross-prefix= --arch=armel --target-os=linux --prefix=/my/path/were/i/keep/built/arm/stuff libavutil 55. 19.100 / 55. 19.100 libavcodec 57. 28.103 / 57. 28.103 libavformat 57. 28.101 / 57. 28.101 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 39.102 / 6. 39.102 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 Input #0, image2, from '*.jpg': Duration: 00:00:21.32, start: 0.000000, bitrate: N/A Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 25 fps, 25 tbr, 25 tbn, 25 tbc File '/home/pi/foo.mkv' already exists. Overwrite ? [y/N] y [swscaler @ 0x3671f30] deprecated pixel format used, make sure you did set range correctly Output #0, matroska, to '/home/pi/foo.mkv': Metadata: encoder : Lavf57.28.101 Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv422p, 640x480, q=2-31, pass 2, 200 kb/s, 25 fps, 1k tbn, 25 tbc Metadata: encoder : Lavc57.28.103 ffv1 Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> ffv1 (native)) Press [q] to stop, [?] for help frame= 533 fps=4.2 q=-0.0 Lsize= 97815kB time=00:00:21.32 bitrate=37584.4kbits/s speed=0.168x video:97808kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.006607% 

Каждый jpeg составляет приблизительно 43143 байта (на ls -al), но, выполнив следующую команду, инструмент заявляет, что каждое изображение составляет 614400 байтов (как в видео, так и в независимых изображениях jpeg). Я бы предположил, что это размер несжатого изображения (640x480x2).

ffmpeg -pattern_type glob -i '* .jpg' -f framemd5 -

ниже приведены результаты для изображений, такие же размеры приведены для MKV.

ffmpeg version N-79053-g7eedad9 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 4.6 (Debian 4.6.3-14+rpi1) configuration: --enable-cross-compile --cross-prefix= --arch=armel --target-os=linux --prefix=/my/path/were/i/keep/built/arm/stuff libavutil 55. 19.100 / 55. 19.100 libavcodec 57. 28.103 / 57. 28.103 libavformat 57. 28.101 / 57. 28.101 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 39.102 / 6. 39.102 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 Input #0, image2, from '*.jpg': Duration: 00:00:21.32, start: 0.000000, bitrate: N/A Stream #0:0: Video: mjpeg, yuvj422p(pc, bt470bg/unknown/unknown), 640x480, 25 fps, 25 tbr, 25 tbn, 25 tbc #format: frame checksums #version: 1 #hash: MD5 #software: Lavf57.28.101 #tb 0: 1/25 #stream#, dts, pts, duration, size, hash Output #0, framemd5, to 'pipe:': Metadata: encoder : Lavf57.28.101 Stream #0:0: Video: rawvideo (Y42B / 0x42323459), yuvj422p, 640x480, q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc Metadata: encoder : Lavc57.28.103 rawvideo Stream mapping: Stream #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native)) Press [q] to stop, [?] for help 0, 0, 0, 1, 614400, 2148ff8b95296f4bacc1099d13235063 0, 1, 1, 1, 614400, da330e2acd2f7d7a1e79fe79fccc90cf 0, 2, 2, 1, 614400, f55563c13a9f232ce32419fa26e37214 0, 3, 3, 1, 614400, c53d994fff0a9b26529fa8763deae520 

РЕДАКТИРОВАТЬ: Лучшее сжатие (и хорошая скорость) было получено из контейнера изображений в формате JPEG:

ffmpeg -pattern_type glob -i '* .jpg' -vcodec copy -an -f matroska ~ / foo.mkv

Полученный файл был чуть более 24M (против 96M ffv1). Также распакованные JPEG-изображения были 312M, в обоих случаях они сжимались довольно хорошо. Если бы я начал с чего-то другого, кроме jpeg, ffv1 был бы идеальным, но в моем случае jpeg с потерями, где также есть исходные изображения без потерь.

1
По умолчанию [demuxer файла изображения] (http://ffmpeg.org/ffmpeg-formats.html#image2-1) будет использовать частоту кадров 25. Если вы хотите изменить ее, используйте параметр ввода `-framerate` ( и дополнительно параметр вывода `-r`, если вы хотите изменить частоту кадров ввода-вывода). Вы можете предварительно обработать изображения JPG с помощью `jpegtran`, чтобы выполнить оптимизацию без потерь (см. [Пример] (http://stackoverflow.com/a/32151594/1109017) с использованием bash« for loop »), прежде чем смешивать с` ffmpeg`. Ваши результаты могут отличаться в зависимости от самих файлов JPG. LordNeckbeard 8 лет назад 0

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

0
Tandy Freeman

I've generally found that encoding lossy video with a lossless codec results in a larger file size. FFmpeg has to decompress your input before it can encode to ffv1, so it is working from the uncompressed version of your jpegs. The process is outlined here: https://ffmpeg.org/ffmpeg.html#Detailed-description

Ссылка предоставила необходимую мне информацию. Поскольку jpeg распаковывается, то снова сжимается ffv1, это не так мало. К сожалению, это не объясняет, почему сжатие отдельных JPEG-изображений лучше, чем многокадровое сжатие с помощью ffv1, но это все же факт. user1373984 8 лет назад 0
Если я вас правильно понимаю, вам интересно, почему при копировании -vcodec файл меньшего размера, чем -vcodec ffv1? Это потому, что он не перекодирует ваши JPEG, а просто копирует стриму. Вот почему это так быстро, узким местом является то, как быстро ваш жесткий диск может копировать / вставлять. Tandy Freeman 8 лет назад 0

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