Мультимедиа-сжатие – это использование специальных алгоритмов для упаковки «сырых» графических и звуковых данных. Это достаточно популярная среди пользователей возможность современных архиваторов. Хотя сам я не разделяю энтузиазма по поводу её важности (много ли народа имеет дело с *несжатыми* графикой и звуком?), тем не менее я предпринял изучение этой области и публикую здесь результаты в надежде, что кому-нибудь ещё это может оказаться полезным.
Во-первых, наиболее известные архиваторы, в которых оно реализовано: RAR, SBC, UHARC, CCM, WinRK. Сравнить степень сжатия ими мультимедийных данных можно на страницах тестов, приведённых ниже.
Во-вторых, как его реализовать в своей программе: для начала нужен детектор мультимедийных данных. В самом простом виде это можно делать по расширениям, несколько сложнее – по заголовкам файлов, универсальный способ – анализом самих данных. Универсальный детектор MMDET входит в мой пакет
http://www.haskell.org/bz/mm.zip ; трудности корректного обнаружения мультимедии описаны на странице
http://www.encode.ru/forums/index.php?a ... &topic=391
Далее, есть простой путь – после определения типа мультимедии просто вычесть последовательные элементы данных в каждом канале (я называю это дискретным дифференцированием) и передать обычному алгоритму сжатия. Как показывает опыт, наилучшие результаты при этом показывают алгоритмы группы BWT/ST (это один из секретов успехов SBC в сжатии мультимедии), на втором месте – PPMD 3-5 порядка, и на последнем – LZMA.
Более приличные результаты даёт, конечно, использование специализированных lossless кодеков, к рассмотрения которых мы и переходим.
ЗВУК
Ориентироваться в результатах специализированных алгоритмов сжатия звука удобно по страничкам:
http://squeezechart.freehost.ag/audio.html
http://uclc.info/lossless_audio_compression_test.htm
Из всех этих программ я прокомментирую только open-source, в порядке уменьшения максимальной степени сжатия:
MPEG-4 ALS: очень медленно работает. Лицензия позволяет использовать его только в MPEG4 продуктах.
APE (Monkey’s Audio): определённой лицензии нет, надо договариваться с автором. Асимметричен, т.е. достаточно медленно сжимает, но быстро распаковывает.
TAK: очень многообещающий кодек, исходники которого пока закрыты, но есть обещания их открыть. Если и когда это произойдёт – станет вероятно наилучшим выбором. Ассиметричен. Сжатие близко к APE, но упаковка/распаковка afair идёт быстрее.
WAVPACK: BSD лицензия, ассиметричен, поддерживает 24/32-битные форматы.
TTA 2.0: GPL лицензия, симметричен, поддерживает 24/32-битные форматы, но имеет с ними небольшие проблемы. По сжатию близок к WAVPACK, по сравнению с ним куда быстрее пакует и медленнее распаковывает. Я использовал именно его в
http://www.haskell.org/bz/mm.zip, поскольку он имеет наименьший размер исходников (в несколько раз меньше WAVPACK) и в нём оказалось проще всего разобраться и задействовать в своей программе.
TTA 3.3 от TTA 2.0 отличается двумя вещами: исправлена проблема с вылетом на 24-битном формате и убраны более мощные уровни сжатия, оставлен только один, самый быстрый.
FLAC: BSD лицензия, ассиметричен
ГРАФИКА
Ориентироваться в результатах специализированных алгоритмов сжатия графики удобно по страничкам:
http://squeezechart.freehost.ag/bitmap.html
http://uclc.info/kodak_grey-scale_image ... n_test.htm
Страница
http://uclc.info/win32_compressor_builds.htm содержит ссылки на исходники некоторых из упомянутых там программ.
Из этих программ я прокомментирую опять же только open-source, в порядке уменьшения максимальной степени сжатия, и приведу для ориентации время сжатия ими 2 мб файла на 1.2 ГГц процессоре:
MRP: время упаковки – где-то в районе часа, распаковки – несколько секунд, 890 кб
BMFg: время упаковки/распаковки – 5.7 секунды, 907 кб. Правда, исходников на самом деле нет
MRP: 30/1.3секунд, 950 кб. Использовались опции “-I 1 -h -K 10 -M 2 -V 1”
SLP: 3 секунды, 952 кб. Исходники:
http://web.archive.org/web/200412121212 ... s/slpenc.c
http://web.archive.org/web/200412121210 ... s/slpdec.c
CALIC: 1.9 секунды, 958 кб. Вероятно, разнице в скорости с SLP мы обязаны только более удачному использованию арифметического кодирования. Комментарии в исходники упоминают LOCO-LS, так что возможно это некая производная JPEG-LS
COBALP: 4 секунды, 964 кб.
SLP-RICE: 0.55 секунды, 976 кб. Более быстрая версия SLP, использующая тот же предиктор, но Rice coding вместо арифметики. Вероятно, «арифметическую» версию можно значительно ускорить, использовав более быстрый арифметический кодер. Исходники:
http://web.archive.org/web/200412301602 ... s/enc_0r.c
http://web.archive.org/web/200412301602 ... s/dec_0r.c
JPEG-LS: 0.27 секунд, 990 кб. Принято считать, что JPEG-LS работает довольно медленно, но сжимает лучше JPEG-2000, видимо в данном случае расхождение вызвано тем, что я тестировал код, не использующий арифметического дожатия. Лицензия допускает свободное использование в некоммерческих целях. Исходники:
http://kt.ijs.si/aleks/jpeg-ls/jpeg_ls_v1.1.tar.gz
http://kt.ijs.si/aleks/jpeg-ls/jpeg_ls_v2.2.tar.gz
JPEG-2000 lossless (JASPER): 1.8 секунды, 991 кб. BSD лицензия
FreeArc 0.37 (MM+GRZipII): 3.6 секунд, 1153 кб. Для сравнения – результаты обычного архиватора.