IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Как программно вытащить аудиоданные из WAV??? (https://www.imho.ws/showthread.php?t=103237)

Rundll 03.05.2006 18:27

Как программно вытащить аудиоданные из WAV???
 
Люди!!!, а как из wav (RIFF) файла вытащить именно звуковые данные (помоему они там имеют тип данных double). Заголовок я могу прочитать, а вот сами данные не знаю как ): В инете инфа есть, но там только заголовок читают. Буду очень благодарен за любую информацию и помощь!

GOre01 03.05.2006 22:14

У же была похожая тема, пользуйся поиском.
Смотри здесь

Rundll 09.05.2006 13:48

Написал я прогу, которая читает заголовок и затем, соответственно, сами данные wav файла, вроде бы всё нормально. После блока 'data' + 4 байта, начинаю читать отсчёты аудиоинформации, полученные данные внимательно сравниваю с данными hex-редактора, первые 84 слова (тестировал на стандартном медиа файле ОС windows - "chimes.wav": 22,5 кГц, стерео, 16 бит на отсчёт) совпадают точно! Затем происходит непонятная мне вещь, начиная с относительного адреса 0000:00D4, все данные смещаются на один байт, и выборки читаются по нечётным адресам медиафайла??? Странно? Вот результат сравнения отрезка информации, где происходит непонятное мне смещение:

hex-редактор:

0000:00C0 08 00 04 00 08 00 01 00 06 00 00 00 04 00 02 00
0000:00D0 07 00 05 00 0D 00 03 00 09 00 05 00 0C 00 04 00


Работа программы :

8, 4, 8, 1, 6, 0, 4, 2,
7, 5, 768, 2304, 1280, 3072, 1024, 1792

указатель на выборку 0D00, по адресу D4, перескакивает на выборку 0003, что и даёт результат 768, вместо необходимого 13!

друзья, подскажите пожалуйста в чём беда?

С уважением Rundll!

_Lynx_ 11.05.2006 11:36

Может где опечатался или проглядел - код напиши

по твоим структурам:
Цитата:

ReadFile(hf, &riff, sizeof(riff_head), &readed, NULL);
ReadFile(hf, &head, sizeof(wav_head), &readed, NULL);
ReadFile(hf, &data, sizeof(data_head), &readed, NULL);
nBlockAlign=head.channels*head.bitsPerSample/8;
while(ReadFile(hf, &buff, nBlockAlign, &readed, NULL));
читаем по четыре байта

здесь ещё по формату написано
http://graphics.cs.msu.su/courses/cg...lp/wavfmt2.htm

<Mmsystem.h>

crawler 12.05.2006 11:23

Сами данные записываются по разному. Тип данных указан в заголовке. Данные могут быть (на сколько помню) 8/16/32 бита целочислинные или 32 бита с плавающей запятой. Соответственно и читать их лучше не "по 4 байта" и иметь геморрой с преобразованием, а как указано в заголовке. Кроме этого не забывай про моно/стерео/квад потоки - для моно потока сэмплы идут один за другим, а в стерео чередуются.
А и еще. Описания формата заголовка на многих сайтах противоречивы и неправильны. Так что смотри в хекс-едиторе пока не будет совпадения ;)

_Lynx_ 12.05.2006 12:52

Цитата:

crawler:
Сами данные записываются по разному. Тип данных указан в заголовке. Данные могут быть (на сколько помню) 8/16/32 бита целочислинные или 32 бита с плавающей запятой. Соответственно и читать их лучше не "по 4 байта" и иметь геморрой с преобразованием, а как указано в заголовке. Кроме этого не забывай про моно/стерео/квад потоки - для моно потока сэмплы идут один за другим, а в стерео чередуются.
Четыре получилось как раз из заголовка:
2 канала * 16 бит на сэмпл / 8
Итого 4 байта

Rundll 13.05.2006 01:03

Ребята, я просто забыл указать в параметре функции fopen - параметр "b". Это и есть решение проблемы! Иначе происходил перенос на следующую строку, символ которого занимал байт, в этом и весь косяк!


Часовой пояс GMT +4, время: 22:40.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.