Lossless — сжатие видео без потери качества


Вы, наверное, не раз слышали такой термин, как сжатие видео без потери качества. В англоязычной литературе такой тип сжатия называется — lossless compression.

Lossless compression-кодирование без потери качества. Видео сжатое lossless кодеком полностью идентично оригиналу. Грубо говоря, закодированное видео можно раскодировать и все будет, как и было. Ни один байт не потеряется.

Недостатком lossless компрессии является требование к месту на диске. Если исходное видео было 50 MB, то сконвертировав его с помощью lossless кодека вы получите несколько сотен мегабайт.

Как вы успели догадаться, помимо сжатия без потери качества, есть еще сжатие с потерей качества (Lossy compression). Таким способом жмут видеопоток все популярные кодеки (xvid, divx, x264 и многие другие).

Lossy compression — кодирование с потерей качества. По сжатому видео невозможно восстановить исходное. Информация о кадре потеряна. Фарш невозможно провернуть назад.

Для чего нужно сжатие без потери качества

Сжатие без потери качества необходимо в том случае, если нужно перенести видео из одной программы в другую. Представьте ситуацию, вам прислали видео с телескопа, который записал его в хитром формате и ваш любимый видеоредактор не может его открыть. Тут возможны два варианта:

  1. С помощью сторонней утилиты сконвертируем исходное видео в формат понятный для видеоредактора (например в mp4). Но в этом случае есть шанс потерять в качестве, так как любое (почти любое) преобразование видео из одного формата в другой ведет к ухудшению картинки, даже если вы отвели под это гигантский битрейт. Этот вариант нам не подходит, так как информация с телескопа ценная и вот так просто разбрасываться качеством картинки мы не имеем права. То есть, в данном случае мы отказываемся от Lossy кодека.
  2. Давайте преобразуем это видео не в широкораспространенный формат (mp4), а в другой. В тот, который сохранит все наши данные в первозданном виде. А полученное видео мы скормим видеоредактору. Для этого возьмем кодек Huffyuv. Как говорит Wikipedia этот кодек сжимает без потерь и сжатое видео полностью совпадает с исходным. Как вы уже поняли, Huffyuv относится к семейству Lossless кодеков, а это именно то, что нам нужно.

Как сжать видео без потери качества

Для того чтобы сконвертировать наше видео при помощи кодека Huffyuv мы возьмем самые распространенные бесплатные программы ffmpeg и mencoder. Они поддерживает кучу экзотических форматов и конечно же смогут закодировать кодеком Huffyuv.

FFmpeg

Что такое FFmpeg, где его скачать и как его установить я подробно расписал в этом руководстве.

После установки необходимо проверить поддерживает ли, скачанный вами ffmpeg кодек Huffyuv. Для этого выполните:

ffmpeg -codecs

Если на выходе будут вот такие строки:

DEV..S ffv1                 FFmpeg video codec #1
DEVI.S ffvhuff              Huffyuv FFmpeg variant

значит можно приступать к кодированию.

ffmpeg.exe -i input.mp4 -c:v huffyuv output.avi

Mencoder

Краткая информация об MEncoder приводится здесь. Свежую сборку под Windows можно найти на Sourceforge: http://mplayerwin.sourceforge.net/downloads.html

Проверим, поддержку кодека Huffyuv нашим mencoder.exe:

mencoder.exe -ovc help
C:\Users\admin\Downloads>mencoder.exe -ovc help
MEncoder Redxii-SVN-r38055-6.2.0 (x86_64) (C) 2000-2018 MPlayer Team
Using FFmpeg N-90642-gd64183ea5d (2018-04-10 02:36:11 +0200)
Compiled on 2018-04-10 09:11:12 EDT (rev. 1)

Available codecs:
   copy     - frame copy, without re-encoding. Doesn't work with filters.
   frameno  - special audio-only file for 3-pass encoding, see DOCS.
   raw      - uncompressed video. Use fourcc option to set format explicitly.
   nuv      - nuppel video
   lavc     - libavcodec codecs - best quality!
   xvid     - XviD encoding
   x264     - H.264 encoding

В отличии от ffmpeg, mencoder не показал нам наличие строки huffyuv в запросе на поддерживаемые кодеки. Но зато он выдал вот такую строчку:

lavc - libavcodec codecs - best quality!

А это то что нам надо, ибо huffyuf кодек сидит в библиотеке lavc. Поэтому можно кодировать mencoder’ом используя кодек huffyuv:

mencoder.exe input.mp4 -o output.avi -ovc lavc -lavcopts vcodec=huffyuv:format=422P -oac pcm

У неискушенного читателя может возникнуть вопрос. Зачем проверять ffmpeg и mencoder на поддержку тех или иных кодеков (в нашем, случае huffyuv)? Ведь эти инструменты объявлены универсальными и утверждается, что они поддерживают все возможные форматы кодирования мультимедиа. Дело в том, что существует много различных сборок ffmpeg и mencoder. Какие-то сборки поддерживают один кодек, но не поддерживают другой, другие наоборот. Можно собрать ffmpeg и mencoder таким образом, что они будут работать только с одним форматом данных (например h.265). Соответственно они  будут иметь очень маленький размер. Для чего это нужно? Ну может для всяких встраиваемых систем, типа Raspberry Pi или на WEB серверах (вдруг захочется свой YouTube запилить 🙂 ).

Сравнение

Попробуем сжать следующее видео без потери в качестве изображения:



Волны были выбраны не случайно, потому что для видеокодека нет ничего сложнее чем движение по всему кадру и наличие мелких частиц, хаотично летающих по всем направлениям.
Но прежде чем закодировать это видео с помощью кодека Huffyuv (сжатие видео без потери качества), мы сначала сделаем, кое что еще.
Бытует мнение, что если использовать стандартный Lossy кодек, например x264, но сказать ему использовать сколько угодно большой битрейт (пусть ни в чем себе не отказывает), то мы получим сжатие без потери качества. Давайте проверим:

ffmpeg -i Wave.mp4 -c:v libx264 -crf 0 -preset veryslow Wave-libx264-crf-0-ffmpeg.mp4

Здесь ключ «-crf 0» указывает на то, что для кодирования видеопотока кодек волен брать любой битрейт. В результате получили файл Wave-libx264-crf-0-ffmpeg.mp4 размером 600 MB. Размер полученного видео увеличился в 30 раз.

После этого сразу запустим кодирование с помощью huffyuv, чтобы получить видео без потери качества (Lossless кодирование):

Получился файл размером 1300 MB, что в 65 раз превышает исходный по размеру. Дисковым пространством приходится жертвовать.

А теперь сравним, полученные видео с оригиналом.

Сделаем cкриншот видео на 5-ой секунду и из всего кадра вырежем квадратик размером 256×256.


Исходное видео
20MB

Для нахождения разницы между изображениями воспользуемся Imagemagick (мощный консольный редактор изображений):

magick.exe composite img1.png img2.png -compose difference diff.png

в данном случае мы вычли img2.png из img1.png и результат записали в diff.png

 

x264 -crf 0 lossy
Lossy с неограниченным битрейтом (libx264)
800MB
huffyuv кодек
Lossless (huffyuv)
1300MB
отличие оригинала от x264 кодека
diff = orig — libx264

diff = orig — huffyuv

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

Huffyuv выступил на отлично. Черный квадрат указывает, что различия отсутствуют и оригинальная и закодированная картинки полностью идентичны.

Заключение

Подитожим вкратце основные преимущества/недостатки Lossless сжатия (сжатие видео без потери качества), на примере кодека Huffyuv:

  • работает быстро;
  • требует много места на диске 20MB mp4 превращаются в 1.3GB hufyyuv;
  • необходим для работы с ценными данными;
  • подходит для обмена данными между программами обработки видео, когда невозможно настроить frameserver (когда один видеоредактор передает несжатое видео другому видеоредактору без промежуточной записи на диск).

You May Also Like