[SDK] Сжатие большого количества WAV в один архив

Список разделов Ogg Vorbis Ogg Vorbis

Описание: Обсуждение всех вопросов касательно Ogg Vorbis

Сообщение #1 G2V » 31.07.2006, 20:52

Есть довольно большой набор маленьких WAVок, формат (и SDK) позволяют упаковать их в один архив.
Но через несколько десятков файлов процесс начинает катастрофически замедляться :( После нескольких тысяч файлов кодек тратит на каждую секунду уже по несколько минут, что неприемлемо...
debug-путём выяснено, что нормальном режиме
Код: Выделить всё
float ** buffer = vorbis_analysis_buffer(&vd, readLength);
практически не занимает процессорного времени (меньше ms/сампл), а работает
Код: Выделить всё
vorbis_analysis_blockout(&vd, &vb)
(и сопутствующие функции, как в примере из sdk)
когда начинается глюк, ситуация меняется на противоположную, т.е. всё выглядет так, будто кодек занимается только перераспределением памяти (хотя, похоже, адреса не меняются)
Возможно, кто-нибудь сталкивался с подобной проблемой или может объяснить, где искать глюк. Буду очень благодарен.
G2V
Репутация: 0
С нами: 17 лет 7 месяцев

Сообщение #2 VEG » 01.08.2006, 15:14

Здравствуйте.
Вам стоит обратиться к разработчикам через список рассылки http://lists.xiph.org/mailman/listinfo/vorbis-dev . Думаю, там мы точно найдете ответ на свой вопрос.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 40
С нами: 18 лет 4 месяца

Сообщение #3 G2V » 01.08.2006, 16:45

VEG:Здравствуйте.
Вам стоит обратиться к разработчикам через список рассылки http://lists.xiph.org/mailman/listinfo/vorbis-dev . Думаю, там мы точно найдете ответ на свой вопрос.

спасибо
G2V
Репутация: 0
С нами: 17 лет 7 месяцев

решение проблемы

Сообщение #4 G2V » 17.01.2007, 12:38

Оказалось, что wav-файлы имеют ошибки в формате, а именно, после data-chunk`а оказались ещё данные, не относящиеся к аудио-потоку ("мусор"). Иногда они вызывали передачу нулевого количества данных кодеку (признак конца потока данных для сжатия). Обидно, долго мучался :(

Вывод: читать ровно то количество данных, которое указано в заголовке data-секции wav-потока.

С уважением,
G2V
G2V
Репутация: 0
С нами: 17 лет 7 месяцев

Сообщение #5 VEG » 17.01.2007, 16:07

Если не секрет, над какой программой вы работаете?
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 40
С нами: 18 лет 4 месяца

Сообщение #6 G2V » 17.01.2007, 16:13

не уверен, что какое бы то ни было разглашение допустимо (по правилам компании), так что название пусть будет секретом :)

по сути - много wav-файлов объединяются в один поток + запоминаются смещения = один архив (кстати, сжатие - по максимуму - даёт выигрышь порядка 30x :!: )
G2V
Репутация: 0
С нами: 17 лет 7 месяцев

Сообщение #7 VEG » 17.01.2007, 16:22

Запоминать смещения не надо. Формат поддерживает т.н. главы. То есть вы можете реализовать эту функцию без потери совместимости с форматом. Реализуется это очень просто — каждый файл кодируется по отдельности (т.е. у каждого свои первые 3 фрейма со служебными данными и свой серийный номер), но все записываются в один общий поток в нужной последовательности.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 40
С нами: 18 лет 4 месяца

Сообщение #8 G2V » 17.01.2007, 16:29

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

Вопрос мне на будущее - есть ли толковые инструкции по использованию кодека? (на русском - вдвойне хорошо)
Документация на официальном сайте малоинформативна, пример тоже - показывает только простейшее использование.
G2V
Репутация: 0
С нами: 17 лет 7 месяцев

Сообщение #9 VEG » 17.01.2007, 16:44

На русском языке описан только контейнер Ogg. Что касается SDK для работы с форматом — только документация к libvorbis. Ну я бы не сказал, что она скудная. Описана не только работа с библиотекой, но и внутреннее устройство формата. Могу порекомендовать в качестве примеров использовать исходные коды vorbis tools.
А что касается кодирования многих мелких файлов. У вашего метода есть один маленький недостаток. Границы между файлами могут попадать в один общий фрейм, и если надо будет извлечь один конкретный фрагмент, то придется декодировать этот фрейм полностью. Впрочем, там затраты смешные, но все же:) Но вам виднее.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 40
С нами: 18 лет 4 месяца

Сообщение #10 G2V » 17.01.2007, 16:56

Проблема была как раз с отсутствием документации по libvorbis :( Хотя сейчас пока всё налажено и работает нормально.
Можно ссылку на исходники vorbis tools? (пусть будут)

А затраты процессорного времени не так существенны, как степень сжатия, так что пусть работает так :)
G2V
Репутация: 0
С нами: 17 лет 7 месяцев

Сообщение #11 VEG » 17.01.2007, 17:10

Исходные тексты vorbis tools тут: http://downloads.xiph.org/releases/vorbis/vorbis-tools-1.1.1.zip
Разрешите узнать, вы кодируете статической или динамической libvorbis? И какой вариант: Официальный, aoTuV или Lancer?
Кстати, неплохим вариантом было бы кодирование через внешний консольный кодировщик oggenc.exe — более гибко в настройке для пользователя.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 40
С нами: 18 лет 4 месяца

Сообщение #12 G2V » 17.01.2007, 17:16

Официальный кодек, динамическая линковка. Консольный кодировщик... сейчас это уже не актуально, написано по-другому :)
А где есть документация к libvorbis?
G2V
Репутация: 0
С нами: 17 лет 7 месяцев

Сообщение #13 VEG » 17.01.2007, 17:31

Вот что по этому поводу я нашел:
http://lists.xiph.org/pipermail/vorbis/2003-March/022838.html
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 40
С нами: 18 лет 4 месяца

Сообщение #14 G2V » 17.01.2007, 17:36

Понятно, значит, будем ждать, когда напишут 8)

Спасибо за помощь!
G2V
Репутация: 0
С нами: 17 лет 7 месяцев


Вернуться в Ogg Vorbis



cron