Возможно ли для 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 с потерями, где также есть исходные изображения без потерь.