Сжатие видео. Теория и практика

Вводная тема: Скорость/размер/качество

Все знают, что многочисленные программы для кодирования видео в современный формат h.264 (он же “AVC”, он же “Mpeg-4 Part 10”) сильно отличаются не только по скорости, но и качеству своей работы. Критерием оценки качества любой программы для кодирования видео (далее - “кодек”) являются три параметра:

  1. Качество полученного видеофайла (т.е. то, насколько результат похож на оригинал)
  2. Размер полученного видеофайла
  3. Время, затраченное на кодирование.

Т.е. условный “наихудший кодек” будет жать долго, сделает файл большого размера и даже на глаз, видео будет сильно отличаться от оригинала.
Идеальная программа сделает все быстро, полученный файл будет небольшим и неотличимым от оригинала.

Но так как идеал недостижим, будем есть, что дают ориентироваться на реалии.

Изучая эту тему много лет, я остановился на небольшой бесплатной программе “x264”. Она, при равном размере получаемого файла, позволяет выполнить кодирование быстрее или качественнее, чем аналоги. Я говорю “или”, т.к. x264 позволяет изменять настройки в широком диапазоне, позволяя выбрать соотношение качество/скорость/размер файла. Если я делаю короткий видеоролик, который буду показывать клиенту для утверждения, мне без разницы, какой получится размер файла, но мне важно, чтобы качество и скорость кодирования были высокими.
Если мне нужно отправить клиенту ролик на подтверждение по почте - мне нужны высокая скорость и малый размер файла, качеством можно пренебречь, т.к. клиент понимает, что это предварительный вариант.
И, наконец, когда я делаю финальный вариант видеоролика (или свадебного видео) мне важны и качество и размер файла (нужно порой уложиться в размер DVD/BLURAY болванки), а вот затраченное время не столь важно (когда я пишу эти строки, мой компьютер уже 12 часов сжимает двухчасовой фильм, и работать ему еще часа три).
Поэтому, когда в новостях пишут, что новая программа жмет видео очень быстро, а тестеры в обзорах нахваливают этот кодировщик, я первым делом смотрю, сможет ли новая программа кодировать видео быстрее, чем x264 в режиме “ultrafast”? Как правило, не может. Да и кодирует обычно хуже при том же размере полученного файла. Таким образом, сравнивая различные видеокодеки, нужно учитывать все три параметра. И если скорость можно измерить секундомером, а выяснение размера файла вообще не является проблемой, то как же честно и непредвзято сравнивать качество кодирования? И почему именно формат h.264, а не Mpeg-2, например? Об этом я расскажу в следующий раз…

Комментарии, исправления, уточнения и вопросы только приветствуются!

6 Likes

Сегодня, как и обещал, расскажу о преимуществах формата h.264 перед устаревшим, но все еще живым MPEG-2. Для начала возьмем фрагмент видео из темы Adobe Premiere и производительность Cuda с названием “TEST 005 AVCHD CANON 5D” и сделаем так, чтобы он мог гарантированно отправиться электронной почтой, т.е. уложим его в 10 мегабайт (оставим место под звук и т.д.) Длительность видео - чут менее 18 секунд. Для чистоты эксперимента будем пользоваться только штатными средствами Adobe Premiere CS 6.0. Сначала жмем в формат MPEG-2, затем в h.264. Выставляем максимально качественные настройки, предназначенные для BluRay дисков. В поле “Битрейт” вписываем - 4.359. После этого через фреймсервер и программу x264 делаем еще два вариант сжатия. В качестве Medium (оно максимально приближено по скорости кодирования к Premiere) и в качестве VerySlow (Это почти самый качественный режим. Есть еще Placebo, но в нем особого смысла нет, а скорость ниже).
Рендерим, и полученное видео снова кладем на TimeLine. Для визуального сравнения делаем скришоты:

Изображения целиком, доступные по клику

Оригинал изображения:

MPEG-2:

h.264 (выведенным средствами Premiere):

h.264 (выведенный через фреймсервер и программу x264 качество Medium )

h.264 (выведенный через фреймсервер и программу x264 качество VerySlow )

Увеличенные фрагменты видео:

Фрагмент оригинала:

Фрагмент, сжатый в MPEG2:

Фрагмент, сжатый в h.264 средствами Премьера:

Фрагмент, сжатый в h.264 через x264 качество Medium :

Фрагмент, сжатый в h.264 через x264 качество VerySlow:

И снова фрагмент оригинала, для удобства сравнения:

Время, затраченное на сжатие было примерно равным (кроме режима VerySlow).

Время, затраченное на кодирование (примерное):
  • MPEG-2: 27 секунд
  • h.264 Premiere: 27 секунды
  • h.264 через x264 Medium: 29 секунд
  • h.264 через x264 VerySlow: 55 секунд
Размер полученных файлов:

каждый из полученных файлов для чистоты эксперимента я положил в одинаковый контейнер: “.ts”
MPEG-2 = 10,7 МБ
h.264 через premiere = 9,37 МБ
h.264 через x264 Medium= 9,33 МБ
h.264 через x264 VerySlow = 9,28 МБ

8 Likes

почему такой низкий
Можно выложить скрины настроек экспорта?

3 Likes

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

Конечно, пожалуйста:

Настройки вывода из PREMIERE

h.264

MPEG-2

Найтройки программы x264 (отличие только в параметре "preset"):

Medium:
x264.exe --bitrate 4359 --tune film --pass 1 --preset medium --bluray-compat --vbv-maxrate 30000 --vbv-bufsize 30000 --level 4.1 --keyint 25 --slices 4 --tff --colorprim “bt709” --transfer “bt709” --colormatrix “bt709” --ssim --sar 1:1 -o x264.264 01.avs
x264.exe --bitrate 4359 --tune film --pass 2 --preset medium --bluray-compat --vbv-maxrate 30000 --vbv-bufsize 30000 --level 4.1 --keyint 25 --slices 4 --tff --colorprim “bt709” --transfer “bt709” --colormatrix “bt709” --ssim --sar 1:1 -o x264.264 01.avs

VerySlow:
x264.exe --bitrate 4359 --tune film --pass 1 --preset veryslow --bluray-compat --vbv-maxrate 30000 --vbv-bufsize 30000 --level 4.1 --keyint 25 --slices 4 --tff --colorprim “bt709” --transfer “bt709” --colormatrix “bt709” --ssim --sar 1:1 -o x264.264 01.avs
x264.exe --bitrate 4359 --tune film --pass 2 --preset veryslow --bluray-compat --vbv-maxrate 30000 --vbv-bufsize 30000 --level 4.1 --keyint 25 --slices 4 --tff --colorprim “bt709” --transfer “bt709” --colormatrix “bt709” --ssim --sar 1:1 -o x264.264 01.avs

4 Likes

Но такой низкий поток реально не используется. А может на высоком битрейте один из кодаков работает лучше всех, а на низком на оборот хуже всех. Вот здесь мы теряем объективность. Думаю надо искать другой способ оценки качества кодирования(мы с тобой об этом как то говорили) оценка не на глаз, а цифровым способом. И тестировать с реально используемыми битрейтами. Наша объективность-наш авторитет.

3 Likes

Ну так не все же сразу. :wink: Об этом как раз и будет в следующей части. :slight_smile:

4 Likes

Ждем!

1 Like

ждём, как говорится, продолжения банкета. :slight_smile: очень толково и наглядно… спасибо за Вашу работу!

1 Like

Спасибо за сравнение. Давным-давно, у нас будет вторая часть?