![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
QUOTE Скачать программу: >>>Soldier of Fortune tools<<< Кто-нибудь игру смотрел? Музыка находится в \SoF1\base\sound\music\ внутри файлов .ADP, причём разбитых на два файла, например: lDM1.adp - левый канал (left) rDM1.adp - правый канал (right) Первые 4 байта (DWORD) в этих файлах - это частота (обычно у всех 22050 Hz), далее идёт сжатый звук. Если у файла эти 4 байта отрезать, переименовать в .VOX (Dialogic ADPCM) и открыть в Adobe Audition, то музыка будет играться, даже сносно, но уж сильно зашкаливают пики - такое ощущение, что Audition её сглаживает, потому что скачал в сети сорцы для декодирования Dialogic - так там получилась, примерно, та же самая музыка, только ещё и с треском. Никто не знает, где можно правильную таблицу ADPCM декодирования дёрнуть? Сдаётся мне, что она там своя, как у EA в NFS и от обычного .VOX отличается. Думаю, что это .VOX формат, правда модифицированный, потому что: - У .VOX формата нет заголовка (тут его тоже нет - только эти 4 байта прикрутили), поэтому при декодировании частота всегда указывается вручную. - Насколько я знаю (смотрел исходные коды декодировщика) стандартный .VOX не поддерживает в явном виде 22050 Hz - только 32000 и 24000 (впрочем, частоту проигрывания никто не мешает вручную поменять). - .VOX формат поддерживает только одногоканальный звук - поэтому тут каналы по файлам и разбили. - Ну и, наконец, музыка проигрывается как .VOX, только немного криво из чего следует, что формат правильный, а вот таблица декодирования - нет. Соображения у кого-нибудь есть? Файлы-примеры надо? Исходные коды декодеровщика на Си: oki_adpcm.c voipcodecs/telephony.h voipcodes/oki_adpcm.h Мой отладочный стенд (входной файл "lDM1.adp" с уже отрубленными 4 байтами в начале, выходной - просто потоковое аудио, без .WAV заголовка): CODE #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <malloc.h> #include "voipcodecs/oki_adpcm.h" int main(int argc, char *argv[]){ oki_adpcm_state_t *oki_dec_state; int16_t *post_amp; uint8_t *oki_data; int oki_bytes; int dec_frames; FILE *fl; fl = fopen("lDM1.adp", "rb"); fseek(fl, 0, SEEK_END); oki_bytes = ftell(fl); fseek(fl, 0, SEEK_SET); oki_data = (uint8_t *)malloc(oki_bytes); post_amp = (int16_t *)malloc(oki_bytes*8); fread(&oki_data[0], oki_bytes, 1, fl); fclose(fl); oki_dec_state = oki_adpcm_init(NULL, 24000); dec_frames = oki_adpcm_decode(oki_dec_state, post_amp, oki_data, oki_bytes); fl = fopen("lDM1.wav", "wb"); fwrite(&post_amp[0], oki_bytes, 4, fl); fclose(fl); oki_adpcm_release(oki_dec_state); free(post_amp); free(oki_data); return(0); } |
Siberian GRemlin |
![]()
Сообщение
#2
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) ![]() |
Попробуй это http://ifolder.ru/7279828
|
-=CHE@TER=- |
![]()
Сообщение
#3
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
Попробуй это http://ifolder.ru/7279828 Спасибо, но уже пробовал, утилита попадалась когда на тему .ADP гуглил - она эти файлы не видит. Плюс ко всему там какая-то защита нехилая навешана, так что даже в потрахах порыться не удалось (зацените - Windows Executable, но внутри ни одного имени экспортируемой функции или даже имени .DLL - это я понимаю защита!). |
jTommy |
![]()
Сообщение
#4
|
Наблюдающий ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 197 Регистрация: 4-February 08 Из: деревня Москва Пользователь №: 6 Спасибо сказали: 19 раз(а) ![]() |
Пробовал много всяких программ. В итоге либо ничего, либо музыка с треском. Вообщем все правильно написано, здесь какой-то модифицированный ADPCM.
|
Siberian GRemlin |
![]()
Сообщение
#5
|
![]() Advanced Member ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 537 Регистрация: 4-February 08 Пользователь №: 2 Спасибо сказали: 221 раз(а) ![]() |
Говорят, это очень хорошая программулина жрёт разнообразные ADPCM из игрушек. http://sox.sourceforge.net/
Вы её ещё случайно не пробовали? Извините, самому некогда разбираться. |
-=CHE@TER=- |
![]()
Сообщение
#6
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
На FTP лежит adp2wav.zip - это исходные коды конвертера для Omikron (увы, не помню откуда скачал). Что интересно, таблицы index_table[16] и step_table[89] можно найти в файле игры Defsnd.dll начиная со смещения 010060h. При этом, если эти исходные коды подправить, чтобы они декодировали файлы игры без заголовка (там только 22050 Hz в заголовке), то звук получается примерно как в игре, но всё равно есть какие-то шумы - т.е. алгоритм, видимо, немного другой. Но таблицы совпадают.
Есть большое подозрение, что процедура .60001000 в этой .DLL - это как раз декодирование звукового потока. Её код частично похож на исходники этой программы на Си. |
-=CHE@TER=- |
![]()
Сообщение
#7
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
Расскажу я вам смешную историю.
Я выдернул когда-то давно код декодирования .ADP из SoF, однако, он так чудовищно криво был написан, что за ним тянулось ещё куча дерьма. В итоге так я его собрать в FASM и не смог. И вот, неделю назад, я ломал Disney's Hercules. Там в архиве нет имён - только хеши от них (кстати, так и не смог около 15 файлам имена найти, если кто-то найдёт - скажите, я на сайте обновлю). Так вот, после распаковки там были .ESF файлы, которые являлись звуками. В Геркулесе весьма сочная и прикольная озвучка - решил её сконвертировать (некоторая, кстати, была портирована с PS, типа фразы о том, что нужен 'Memory Card', но их так и не вычистили). Отлаживался-отлаживался, пока не нашёл нужную функцию и дёрнул её. Она была небольшая и аккуратная - там ничего левого не вызывалось. Но, для декодирования процедурке нужны были два DWORD-массива. Я посмотрел их в .EXE, начал заполнять и тут... да, точно, я понял, что уже где-то это видел. И точно - в сорцах декодеровщика IMA ADPCM, который использовал ранее были оба этих массива (step и index) - 1 в 1. Ну тут, как вы поняли, я не выдержал и натравил сей алгоритм декодирования на .ADP... и оно правильно декодировалось! Формат .ADP, кстати, если кому понадобится: dword - sound Hz BYTE[x] - сжатый поток BYTE[20] - 20 байт какой-то херни в хвосте, которую нельзя декодировать - будет треск Размер распакованного потока = размер_упаковонного*4 (т.к. в полбайта кодируется один семпл (16Bit), то в байт их влазит 2 по 2 -> 4). Не помню где, но мне похожие файлы ещё где-то встречались (по сжатию - характерные данные). Что касается самого сжатия - я пытался как-то перегнать в IMA ADPCM сжатый .WAV, но чего-то нехватает - похоже здесь какая-то вариация используется. Хотя, я попробовал сжать разжатый поток в Adobe Audition и он в начале был похож на то что было в игре, правда сдвинуто на полбайта и обменяно местами. Вот так: 0F F1 23 45 67... - оригинальный поток // сдвигаем на полбайта FF 12 34 56 7x... - промежуточное преобразование, чтобы показать как это // меняем полубайты местами FF 21 43 65 x7... - сжатый в Adobe Audition Однако, там тоже есть щелчки при декодировании, где-то каждые 512 байт, после которых сия схема снова слетает. В общем, если кто-то сможет это нормально конвертнуть, то можно будет даже не разжимать в PCM, а просто lossless пересобрать в .WAV с соответствующим кодеком в заголовке. В общем, смотрите исходные коды на сайте. Да, .ADP декодируется в стерео, если есть оба l*.adp и r*.adp файлы. Спасибо сказали:
|
jTommy |
![]()
Сообщение
#8
|
Наблюдающий ![]() ![]() ![]() Группа: CTPAX-X Сообщений: 197 Регистрация: 4-February 08 Из: деревня Москва Пользователь №: 6 Спасибо сказали: 19 раз(а) ![]() |
Огромное Спасибо. Хоть и случайно, а результат есть.
![]() А пробовал сравнивать с таблицами IMA ADPCM или MS ADPCM, сильные там различия? |
-=CHE@TER=- |
![]()
Сообщение
#9
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
|
![]() ![]() |
Упрощённая версия | Сейчас: 7th September 2024 - 23:44 |