Недавно нам на глаза попалась статья В Dropbox разработали алгоритм lossless-сжатия для файлов H.264 и JPEG и мы решили протестировать это решение и получить какие-то ощутимые технические детали.

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

Так же, эффекта от данного вида сжатия можно ожидать в двух случаях: если в файле в качестве кодера используется CAVLC или если файл закодирован блоками PU и TU максимального размера. А это возможно только в том случае, если кодек H.264 настроен на максимально быстрое кодирование.

О проекте «Pied Piper»


Одним из самых «тяжеловесных» среди всех видов данных является видео, и неудивительно, что сервисы, которые связаны с обработкой, передачей или его хранением, задумываются о компрессии. Однако пути решения этой проблемы могут быть различными. В августе 2015 компания DropBox опубликовала свое видение – свой, пока еще не финальный, алгоритм для видеофайлов стандарта H.264. Деятельность компании главным образом связана с хранением файлов своих пользователей. Пользователю неинтересно, в каком виде они хранятся, а важно лишь то, что обратно, при скачивании, он получит в точности те же файлы, что были загружены. Поэтому алгоритм, предложенный DropBox – без потерь качества. Кроме того, результат компрессии не является видеофайлом исходного формата.

В данной статье попробуем определить эффективность алгоритма при сжатии различных файлов. В качестве вспомогательного инструмента будем использовать ZOND 265 компании Solveig Multimedia (это мы и есть ), анализатор видеофайлов H.264 и H.265.

Все файлы, полученные в статье (исполняемый файл компрессора, скомпилированный для Linux Ubuntu x64 12.04, тестовые видеофайлы) можно скачать по этой ссылке.

image

Оценка эффективностьи компрессора проекта «Pied Piper»


Исходные коды и тестовые файлы компрессора доступны на сайте GitHub. Для начала скомпилируем компрессор и оценим тестовые файлы. Затем посмотрим эффективность на файлах, встречающихся в реальной жизни.

Компрессия

Четкие инструкции по компиляции компрессора проекта «Pied Piper» доступны только для Linux, это по сути один файл – скрипт «piedpiper_make». Поэтому загружаем Linux Ubuntu x64 и вводим три команды:

git clone https://github.com/danielrh/losslessh264.git
cd ./lossless264
./piedpiper_make

После компиляции в текущей папке появятся файлы компрессора:

h264dec – исполняемый файл компрессора и декомпрессора,
libopenh264.so.0, libopenh264.so – вспомогательные динамическая библиотека и ссылка на нее.

Компрессия осуществляется командой:

./h264dec ./source-file.264 ./destination-file.pip,

Декомпрессия:

./h264dec ./compressed-file.pip ./decompressed-file.264.

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

Тестовые файлы проекта «Pied Piper»

Согласно репозиторию Git, в качестве тестов разработчики использовали несколько файлов – «black.264», «tibby.264», «walk.264», «BA1_FT_C.264», «BAMQ2_JVC_C.264». Загрузив их в Zond 265, видим, что они сжаты одним и тем же образом (см. скриншоты Zond 265, вкладка «Bitstream», рис. 1-3 для файла «tibby.264»). Основная особенность – использование CAVLC (PPS, entropy_coding_mode_flag: 0) и отсутствие B-кадров (SPS,max_num_reorder_frames: 0). Для тестов эффективности взяты первые три файла.

image
Рис. 1. Блок Sequence Parameter Set (SPS) файла «tibby.264»

image
Рис. 2. Блок Picture Parameter Set файла «tibby.264»

image
Рис. 3. Структура видеопотока файла «tibby.264»

Другие тестовые файлы

Пользователи могут получить видеофайлы несколькими способами: снять его камерой (например, своего телефона), скачать его с различных видеосервисов (youtube, vk, vimeo, facebook и т.д.), воспользоваться программой с функцией перекодирования.

В качестве ролика с телефона взят файл с обычного Android-смарфона, это файл «VID_20150917_131139.264». Он так же не содержит B-кадров, но в качестве арифметического компрессора использует CABAC, а не CAVLC. На файлах, скачанных с youtube (они содержат B-кадры и используют CABAC), компрессор выдает ошибку, поэтому не будем включать их в тестирование.

В качестве программы с функцией перекодирования взята консольная утилита ffmpeg (модуль «libx264»). Забегая вперед, сжатие наблюдалось только с пресетом «ultrafast», с пресетом «superfast» сжатия уже не получалось. Тестовые файлы – «tractor-ultrafast.264», «tractor-superfast.264».
Кроме указанных, в таблицу включены еще три файла с целью оценить, оставит ли предложенный алгоритм эффективным включение опций «CABAC» и кодирования блоками PU и TU максимального размера: «black-cabac.264», «tibby-cabac.264» и «tibby-cabac-max-blocks».

Результаты тестирования

Результаты тестирования сведены в таблицах 1 и 2. Данные о количестве блоков PU и TU для таблицы получены программой Zond 265 (вкладка «Stream Stats»). На рис. 4 изображен скриншот с данными для файла «tibby.264».

image
Рис. 4. Данные о блоках PU и TU для файла «tibby.264»

image
Таблица 1. Результаты тестов эффективности компрессии компрессора проекта «Pied Piper»

image
Таблица 2. Результаты тестов эффективности компрессии компрессора проекта «Pied Piper»

Как видно из таблиц, предложенный алгоритм проекта «Pied Piper» в опубликованной версии эффективен в двух случаях: если в файле в качестве кодера используется CAVLC или если файл закодирован блоками PU и TU максимального размера. А это возможно только в том случае, если кодек H.264 настроен на максимально быстрое кодирование. Очевидно, при этом файлы будут получаться довольно больших размеров. Таковы файлы, получающиеся кодеком ffmpeg с libx264 с пресетом «ultrafast».

Спасибо за внимание, будем рады обсудить результаты. Это наша первая экспертная статья, не судите строго.

Комментарии (11)


  1. Properrr
    18.09.2015 16:41

    Ребята, подскажите, а что это за тулза на 1м скриншоте?


    1. Anisotropic
      18.09.2015 16:47
      +1

      5 абзац прочитай


    1. DmitryVergeles
      18.09.2015 17:14

      скриншоты и таблицы получены софтварным анализатором H.264 и H.265 файлов — ZOND 265


  1. workless
    18.09.2015 18:03

    Pied Piper? Улыбнулся от отсылку к сериалу «Кремниевая Долина»


    1. Alexsey
      18.09.2015 18:31
      +1

      Я сам сериал не смотрел, но читал что вроде как идею алгоритма оттуда и взяли, отсюда и название.


  1. ValdikSS
    18.09.2015 20:16
    +2

    Если честно, полезность этой утилиты крайне сомнительна. Ну кто в здравом уме кодирует с CAVLC, пожалуй, даже не самые современные камеры применяют CABAC.
    А вот ваша утилита выглядит очень круто. Не подскажете ли аналоги?


    1. DmitryVergeles
      18.09.2015 21:21
      +1

      аналогов именно по H.264 много, от бесплатных до тех что стоят под 40К USD. Их всех знает гугл. Но H.264 мы поддерживаем до кучи. изначально это анализатор H.265.


  1. ComodoHacker
    18.09.2015 20:56

    Странные результаты. Разработчики из Dropbox должны были ориентироваться именно на видео с камер. Массовый пользователь видео не перекодирует, тем более не выбирает пресеты. А настройки для быстрого кодирования с небольшим сжатием, очевидно, выставляют на бюджетных смартфонах со слабым процессором (или DSP).

    Может, вы чего-то не учли, ребята? Один «файл с обычного Android-смарфона» это как-то не серьезно. Стоило собрать образцы хотя-бы с десятка моделей побюджетнее.


    1. DmitryVergeles
      18.09.2015 21:18

      ComodoHacker спасибо за ваш комментарий. данный отчет безусловно не является всесторонним. из него видно, что те файлы, которые использовали для тестирования ДропБоксы заведомо выигрышные. насчет бюджетных смартфонов замечание принимается


  1. DjOnline
    19.09.2015 13:21
    +1

    Как я и говорил, для 99% h264, которое и так использует CABAC, это бесполезно.
    Но этот инструмент был бы полезен для lossless пережатия архивного xvid/divx/mpeg4.asp видео в h264 cabac, например для домашнего видео, которое создавалось в те далёкие времения 10-15 летней давности, когда h264 только только появлялся.
    Особенно это было бы полезно для lossless сжатия Mpeg2, и такой инструмент есть, называется OCA_MPEG 0.6 level 12 (P.Skibinski) http://encode.ru/threads/1111-Ocarina-s-MPEG1-and-MPEG2-video-compressor, сжимает до 65%, правда в свой формат, увидеть сравнение можно на https://docs.google.com/spreadsheets/d/1i3-cuVSWzsXWZR-ZpEzOYOaSyV9ajz-IK4fxLMzyOaY/edit#gid=6


  1. DmitryVergeles
    02.10.2015 16:35