1

Возможно ли для 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 ответ1

0

Обычно я обнаружил, что кодирование видео с потерями с помощью кодека без потерь приводит к увеличению размера файла. FFmpeg должен распаковать ваш ввод, прежде чем он сможет кодировать в ffv1, поэтому он работает с несжатой версией ваших jpegs. Процесс описан здесь: https://ffmpeg.org/ffmpeg.html#Detailed-description

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .