Преобразование изображений RGB в видео без потерь с помощью avconv / ffmpeg

5641
despens

Я пытаюсь преобразовать серию изображений PNG24, содержащих анимацию экрана, в видео без потерь, чтобы каждый пиксель воспроизводился точно так, как это было в оригинале. Но avconv (и ffmpeg) дают одинаковые, неудовлетворительные результаты, которые, по-видимому, происходят из-за неправильного преобразования в космическом пространстве.

Это версия avconv, которую я использую:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers built on Apr 2 2013 17:02:36 with gcc 4.6.3 

Каждое из изображений имеет размер 1280 × 800 пикселей. Они не содержат каких-либо фотографических мотивов, а имеют специально размытые узоры.

Я использовал qtrleкодек, потому что, по-видимому, это кодек без потерь, который очень похож на анимированные GIF или анимированные PNG. Однако во время преобразования в видео, кажется, происходит преобразование цветового пространства («фильтр»), которое портится с пикселями.

Это вывод avconv:

$ avconv -f image2 -r 30 -i frames.png/wth-%08d.png -vcodec qtrle -pix_fmt rgb24 -t 15 qtrle-30fps-rgb.mov avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers built on Apr 2 2013 17:02:36 with gcc 4.6.3 Input #0, image2, from 'frames.png/wth-%08d.png': Duration: 00:11:17.96, start: 0.000000, bitrate: N/A Stream #0.0: Video: png, bgra, 1280x800, 30 fps, 30 tbr, 30 tbn, 30 tbc File 'qtrle-30fps-rgb.mov' already exists. Overwrite ? [y/N] y [buffer @ 0x740a00] w:1280 h:800 pixfmt:bgra [avsink @ 0x742ac0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out' [scale @ 0x743680] w:1280 h:800 fmt:bgra -> w:1280 h:800 fmt:rgb24 flags:0x4 Output #0, mov, to 'qtrle-30fps-rgb.mov': Metadata: encoder : Lavf53.21.1 Stream #0.0: Video: qtrle, rgb24, 1280x800, q=2-31, 200 kb/s, 30 tbn, 30 tbc Stream mapping: Stream #0:0 -> #0:0 (png -> qtrle) Press ctrl-c to stop encoding frame= 450 fps= 22 q=0.0 Lsize= 126056kB time=15.00 bitrate=68843.4kbits/s  video:126052kB audio:0kB global headers:0kB muxing overhead 0.003441% 

Это оригинальный файл изображения PNG:

Преобразование изображений RGB в видео без потерь с помощью avconv / ffmpeg

Это скриншот воспроизводимого видео:

Снимок экрана воспроизводимого видео

Обратите внимание, что вам нужно видеть эти изображения в их оригинальном разрешении 1280 × 800, чтобы заметить различия.

Вот параллельное сравнение, при этом левая картинка является исходной, а правая - исходом после кодирования видео:

Преобразование изображений RGB в видео без потерь с помощью avconv / ffmpeg

Можно ли как-нибудь создать действительно качественный видеофайл без потерь из серии PNG?

2
Интересно. Ваш входной файл отображается как `bgra`, а для меня (в` ffmpeg`) - как `rgba`. В любом случае, вы можете попробовать вместо этого установить вывод `-pix_fmt argb`? slhck 10 лет назад 0
Я попробовал argb, результат выглядит точно так же, как и раньше. 10 лет назад 0
Привет @slhck, начиная с твоего комментария я пытался изменить формат PNG, чтобы не требовался автоматический фильтр. Я использовал опцию `-flatten + matte` в ImageMagick, чтобы получить настоящие png-файлы RGB24. Результатом было то, что ** ни один фильтр не был «автоматически вставлен» **, но результат все равно был неправильным. Теперь мне интересно, как изменить кодировщик 'encoder': Lavf53.21.1`? 10 лет назад 0
Кодировщик - это в основном то, что встроено в `avconv` (или` ffmpeg`, если вы используете FFmpeg). Вы можете изменить его, только используя более свежую версию. Насколько мне известно, Libav не предлагает сборки `avconv`, так что вам придется собираться самостоятельно. Или загрузите статическую сборку `ffmpeg` со [их страницы загрузки] (http://ffmpeg.org/download.html). Обратите внимание на разницу между Libav и FFmpeg: [Кто подскажет разницу и соотношение между ffmpeg, libav и avconv] (http://stackoverflow.com/questions/9477115/who-can-tell-me-the-difference и-отношение между ними-FFmpeg-libav-и-avconv) slhck 10 лет назад 0
При этом, если вы можете воспроизвести это в недавней сборке, рассмотрите возможность отправки отчета об ошибке в FFmpeg или Libav, если у вас есть сильное ощущение, что преобразование цветов не является точным (даже если так и должно быть). slhck 10 лет назад 0

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

2
despens

С помощью участника ffmpeg выяснилось, что и ffmpeg, и libav создают безупречные файлы Quicktime без потерь. Похоже, проблема заключается в том, что драйвер видеокарты неправильно отображает видео (так как плееры на базе GStream и VLC отображают его неправильно, однако VLC экспортирует идеальные PNG видеокадров). Если вы хотите проверить, действительно ли видео содержит кадры попиксельно, попробуйте использовать

$ ffmpeg -i input.png -vcodec qtrle out.mov  $ ffmpeg -i input.png -f framecrc - $ ffmpeg -i out.mov -f framecrc - 

Это выведет контрольные суммы данных кадра.

Для визуального сравнения преобразуйте видео без потерь обратно в отдельные кадры и сравните их.

в зависимости от кодеков вам может понадобиться использовать `-pix_fmt` для crc / md5 того же расположения декодированных без потерь данных. Например, декодер ffmpeg RGB h.264 выводит планарный RGB в формате, который ffmpeg вызывает `gbrp`. Peter Cordes 9 лет назад 0
0
Peter Cordes

I posted a longish answer on: How to create an uncompressed AVI from a series of 1000's of PNG images using FFMPEG

vcodec libx264rgb with -preset ultrafast -qp 0, or utvideo.

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