Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2011, 16:53   #1
Voxa7
Пользователь
 
Регистрация: 17.05.2010
Сообщений: 59
По умолчанию Читание WAV

Подскажыте плиз как правильно прочитать wav файл и одержать массив значений. Как правильно считать заголовок файла я знаю.

Подскажыте как считывать данные с блока data и проеобразовать их в массив чисел.
Voxa7 вне форума Ответить с цитированием
Старый 14.03.2011, 17:29   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

не, считывать байты вы должны сами уметь. Могу только подсказать, что удобнее будет считавать данные порциями, например по 1 секунде (хотя это зависит от задачи):

PHP код:
// calculate size of 1 sec
int size hdr.wf.nChannels hdr.wf.nSamplesPerSec hdr.wBitsPerSample >> 3;

// allocate memory (assuming 16 bits per sample)
shortbuf = (short*)malloc(size);

// read size bytes from file f at offset ofs into buf
readfromfile(fofsbufsize); 
Дальше можно работать с сэмплами в buf:

PHP код:
short sample = *buf;
buf++;
sample = *buf
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.03.2011, 17:29   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

не, считывать байты вы должны сами уметь. Могу только подсказать, что удобнее будет считавать данные порциями, например по 1 секунде (хотя это зависит от задачи):

PHP код:
// calculate size of 1 sec
int size hdr.wf.nChannels hdr.wf.nSamplesPerSec hdr.wBitsPerSample >> 3;

// allocate memory (assuming 16 bits per sample)
shortbuf = (short*)malloc(size);

// read size bytes from file f at offset ofs into buf
readfromfile(fofsbufsize); 
Дальше можно работать с сэмплами в buf:

PHP код:
short sample = *buf;
buf++;
sample = *buf
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.03.2011, 17:48   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> проеобразовать их в массив чисел

а в файле по-вашему что, буквы? Там и так числа, ничего преобразовывать не надо, нужно только разрядность знать.

Если заголовок прочли, то имеете смещение в файле к первому сэмплу (обычно это смещение = 44, но не всегда).

Если сэмплы 8-битные, то каждый отсчёт представлен как значение от 0 до 255, где 128 соответствует тишине.

Если сэмплы 16-битные (чаще всего), то каждый отсчёт представлен как значение от -32768 до +32767, тишина = 0.

Если каналов несколько (стерео или 5.1), то каналы чередуются.

Если в заголовке формат не PCM, то сэмплы нужно будет разжать ACM кодеком, указанным в заголовке.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 14.03.2011, 18:11   #5
Voxa7
Пользователь
 
Регистрация: 17.05.2010
Сообщений: 59
По умолчанию

veniside спасибо за ответы, но...

Код:
typedef struct pcinwaveformat_tag { 
    WAVEFORMAT wf;
    WORD vBitsPerSample;
} PCMWAVEFORMAT;

typedef struct waveformat_tag { 
    WORD wFormatTag; // тип формата 
    WORD nChannels; // количество каналов (моно или стeрео)
    DWORD nSamplesPerSec; // частота дискретизации 
    DWORD nAvgBytesPerSec; // скорость потока данных 
    WORD nBlockAlign; // выравнивание блока данных 
} WAVEFORMAT;
Переменная vBitsPerSample местит размер сэмплов в файле, а nChannels - количество каналов.

Подскажыте как имея эти данные считывать сэмплы, а то я сам не догоняю. Если можете, то приведите кусок кода.
Voxa7 вне форума Ответить с цитированием
Старый 15.03.2011, 03:13   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

круто форум заглючило, пост #2 был вобще-то написан в ответ на пост #5.
прям "назад в будущее" какое-то.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 15.03.2011, 16:35   #7
Voxa7
Пользователь
 
Регистрация: 17.05.2010
Сообщений: 59
По умолчанию

veniside спасибо, буду разбиратся
Voxa7 вне форума Ответить с цитированием
Старый 15.03.2011, 20:54   #8
Voxa7
Пользователь
 
Регистрация: 17.05.2010
Сообщений: 59
По умолчанию

Код:
        int size = header.numChannels * header.sampleRate * header.bitsPerSample >> 3;
        short* buf = (short*)malloc(size);
        fread(buf, size, 1, file);
        short sample = *buf;
        buf++;
        sample = *buf;
        printf("data: %f\n", sample);
После этого у меня выводит только ноль и все. Это после считывания заголовка файла. Подскажыте что я делаю не так.
Voxa7 вне форума Ответить с цитированием
Старый 15.03.2011, 22:42   #9
Voxa7
Пользователь
 
Регистрация: 17.05.2010
Сообщений: 59
По умолчанию

Уже сам разобрался.

Я так понимаю что записывать данные в файл нужно так же как и считывать, тоесть при помощи этого самого массива значений buf?
Voxa7 вне форума Ответить с цитированием
Старый 15.03.2011, 22:48   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А что, сэмп не может быть нулевым? Как раз в начале файла вполне логично наличие тишины. Нет, может и в коде ошибка, конечно, но почему сразу думать, что что-то не так? Вы пройдитесь по всем сэмплам, если весь кусок будет состоять из нулей, то тогда будет странно.

Ну и неплохо бы проверять/выводить:

1) чему равно size (чтобы убедиться, что заголовок в header правильно прочитан)
2) header.wFormatTag = 1 (без компрессии)
3) header.bitsPerSample = 16 (иначе вместо short нужен unsigned char)
4) fread() не вернул ошибку.

Это как минимум, чтобы не гадать, откуда нули.

> Я так понимаю что записывать данные в файл нужно так же как и считывать, тоесть при помощи этого самого массива значений buf?

если после обработки размер данных не меняется, то вполне можно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WAV-файл b2soft Общие вопросы .NET 4 09.02.2011 08:02
играть сначала 1.wav потом 2.wav mma Мультимедиа в Delphi 9 23.12.2010 20:04
читание гипертекстовых файлов joker007 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 20.05.2010 04:55
Конвертация аудиофайлов WAV -> WAV namestnik Помощь студентам 2 27.05.2009 23:05
Wav-ы в *.res Altera Общие вопросы Delphi 12 22.09.2008 19:01