DC-SWAT Forum
Конвертирование PCM, ADPCM в WAVE формат - Версия для печати

+- DC-SWAT Forum (http://www.dc-swat.ru/forum)
+-- Форум: Sega Dreamcast (/forum-2.html)
+--- Форум: General Discussion (/forum-7.html)
+--- Тема: Конвертирование PCM, ADPCM в WAVE формат (/thread-767.html)

Страниц: 1 2


RE: Конвертирование PCM, ADPCM в WAVE формат - SWAT - 27.01.2014 13:30

А не пробовал с помощью ffmpeg? В нем есть кодек Yamaha ADPCM.


RE: Конвертирование PCM, ADPCM в WAVE формат - gr_ander - 28.01.2014 22:02

(27.01.2014 13:30)SWAT писал(а):  А не пробовал с помощью ffmpeg? В нем есть кодек Yamaha ADPCM.
Не пробовал, но в курсе, что в нём есть этот кодек. Не хотелось ради этого использовать ffmpeg размером в 7 мб. Нужна утилита, которая узко заточена под определённую конвертацию, как wavecon из KatanaSDK.
Похоже, что нашёл решение: https://github.com/losinggeneration/kos/blob/master/utils/wav2adpcm/wav2adpcm.c

Правда, требуется доработка кода. Во-первых, есть ошибки в заголовке для ADPCM. Во-вторых, при кодировании PCM->ADPCM теряется один байт данных (тоже самое происходит при декодировании ADPCM->PCM).


RE: Конвертирование PCM, ADPCM в WAVE формат - SWAT - 29.01.2014 09:33

Эхх думал в оригинальном репозитории KOS есть исправления, но оказалось кроме форматирования в этом файле ничего не менялось очень давно Sad
http://sourceforge.net/p/cadcdev/kallistios/ci/master/tree/utils/wav2adpcm/wav2adpcm.c


RE: Конвертирование PCM, ADPCM в WAVE формат - gr_ander - 29.01.2014 19:03

(29.01.2014 09:33)SWAT писал(а):  Эхх думал в оригинальном репозитории KOS есть исправления, но оказалось кроме форматирования в этом файле ничего не менялось очень давно Sad
http://sourceforge.net/p/cadcdev/kallistios/ci/master/tree/utils/wav2adpcm/wav2adpcm.c

М-да... Кроме форматирования, никаких отличий.

По поводу неверного заголовка:

строка 234
есть:
Код:
wavhdr.format = 20;

должно быть:
Код:
wavhdr.format = 0x20;

после 235 строки, в соответствии со спецификацией Microsoft для Yamaha ADPCM, нужно вставить этот код:
Код:
wavhdr.blocksize = 1;
wavhdr.byte_per_sec = (wavhdr.channels * wavhdr.freq * wavhdr.bits) / 8;

строка 264:
есть:
Код:
|| wavhdr.format != 20

должно быть:
Код:
|| wavhdr.format!=0x20
(иначе правильный хидер не распознается утилитой)

А по поводу недостающего байта, я думаю проблема в циклах do ... while функций pcm2adpcm и adpcm2pcm. Но тут надо разбираться более подробно.

Может и сам алгоритм кодирования ADPCM неточный. Так как побайтно ADPCM-файлы, созданные при помощи wavecon от Sega и wav2adpcm сильно различаются, хотя на слух звучат одинаково и спектрограмма в GoldWave тоже смотрится идентично.