Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_Ivana
3147 / 1774 / 152
Регистрация: 01.03.2013
Сообщений: 4,977
Записей в блоге: 2
#1

Прочитать несколько секунд wav файла в массив - C++

23.08.2014, 16:27. Просмотров 1121. Ответов 2
Метки нет (Все метки)

Есть win32 проект в Студии. Задача - запросить диалог выбора wav файла, проверить что это wav файл, прочитать его хедер, взять оттуда нужные данные в виде чисел - битрейт, количество каналов, формат и т.п. и затем прочитать заранее заданное количество отсчетов в заранее приготовленный для них массив. Причем, если файл будет моно, то отсчеты читаются как есть, если стерео - то при кодировке центральный/разностный считывается только центральный канал, при правый/левый - среднее арифметическое. Если файл будет не 16-битный, то приводим его в 16 бит - домножаем или делим отсчеты на коэффициент. Я сейчас ооочень коряво реализовал чтение моно вавки, но подозреваю что и здесь у меня полно ошибок, например при прочтении хедера даже не могу взять параметры файла. Как это можно сделать по-нормальному? Если будет реализовано по ООП-шному через классы, то разберусь. Если через дополнительные библиотеки - то смотря какие, WinMM.Lib у меня уже так и так используется, а другие не хотелось бы подключать. Хотя если с ними будет красиво и стройно, то тоже придется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void ReadWav_Proc(HWND hWnd)
{
    SetWindowTextW(hwndSta1, L"Read...");
    HANDLE hFile = INVALID_HANDLE_VALUE;
    if((hFile = CreateFile(L"Test.wav", GENERIC_READ, FILE_SHARE_READ,
        NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) {
        SetWindowTextW(hwndSta1, L"Не могу открыть файл");
        return;
    }
    WAVEHDR WaveTestHdr;
    DWORD readBytes;
    wchar_t buf[20];
 
    if (ReadFile(hFile, &WaveTestHdr, sizeof(WAVEHDR), &readBytes, NULL)) {
        wsprintfW(buf, L"%lu", readBytes);
        SetWindowTextW(hwndSta1, buf);
    } else {
        SetWindowTextW(hwndSta1, L"Не могу прочитать хедер файла");
        return;
    }
    if (ReadFile(hFile, waveOut.buf, sizeof(waveOut.buf), &readBytes, NULL)) {
        wsprintfW(buf, L"%lu", readBytes);
        SetWindowTextW(hwndSta1, buf);
    } else {
        SetWindowTextW(hwndSta1, L"Не могу прочитать данные файла");
        return;
    }
    CloseHandle(hFile);
}
Добавлено через 1 час 17 минут
UPD заголовки вроде уже читаю
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
typedef struct  WAV_HEADER{
        char                RIFF[4];        // RIFF Header      Magic header
        unsigned long       ChunkSize;      // RIFF Chunk Size
        char                WAVE[4];        // WAVE Header
        char                fmt[4];         // FMT header
        unsigned long       Subchunk1Size;  // Size of the fmt chunk
        unsigned short      AudioFormat;    // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
        unsigned short      NumOfChan;      // Number of channels 1=Mono 2=Sterio
        unsigned long       SamplesPerSec;  // Sampling Frequency in Hz
        unsigned long       bytesPerSec;    // bytes per second
        unsigned short      blockAlign;     // 2=16-bit mono, 4=16-bit stereo
        unsigned short      bitsPerSample;  // Number of bits per sample
        char                Subchunk2ID[4]; // "data"  string
        unsigned long       Subchunk2Size;  // Sampled data length
 
    }my_wav_hdr;
    my_wav_hdr WaveTestHdr;
 
    DWORD readBytes;
    wchar_t buf[500];
    if (ReadFile(hFile, &WaveTestHdr, sizeof(WaveTestHdr), &readBytes, NULL)) {
        wsprintfW(buf, L"%.4S %lu %.4S %.4S %lu %u %u %lu %lu %u %u %.4S %lu",
            WaveTestHdr.RIFF,
            WaveTestHdr.ChunkSize,
            WaveTestHdr.WAVE,
            WaveTestHdr.fmt,
            WaveTestHdr.Subchunk1Size,
            WaveTestHdr.AudioFormat,
            WaveTestHdr.NumOfChan,
            WaveTestHdr.SamplesPerSec,
            WaveTestHdr.bytesPerSec,
            WaveTestHdr.blockAlign,
            WaveTestHdr.bitsPerSample,
            WaveTestHdr.Subchunk2ID,
            WaveTestHdr.Subchunk2Size);
        SetWindowTextW(hwndSta1, buf);
    } else {
        SetWindowTextW(hwndSta1, L"Не могу прочитать хедер файла");
        return;
    }
Непонятно только, почему структура заголовка вав файла не задефайнена в ММ-библиотеке, пришлось объявлять свою... Или она там кусками задефайнена, т.к. разные вавки имеют различную структуру заголовков?...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2014, 16:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прочитать несколько секунд wav файла в массив (C++):

Как прочитать несколько байт из файла с n-го бита - C++
Требуется считать байты из файла заданным смещением; смещение задается в БИТАХ; Например: c 3-го бита 8-го байта прочитать 21 байт;

Чтение самплов из wav файла в массив - C++
Всем привет!!! Ситуация такая: Заголовок успешно читаю. Хочу получить массив с самплами. Проблема: Не понимаю как преобразовать...

Как прочитать первую строку из файла а остальной текст повторить несколько раз? - C++
Я новичок в этом деле, прошу не осуждать. Помогите разобраться. Задание такое: Программа должна начать читать запись шоколада с...

Прочитать данные из файла в массив - C++
Здравствуйте, я посоветоваться. Задача моего кода состоит в том, что у меня есть текстовый файл с числами, а в коде есть переменные,...

С текстового файла прочитать массив - C++
1. С текстового файла прочитать массив. 1ая строка - количество элементов. 2ая строка - сам массив. Посчитать сумму элементов до...

С текстового файла прочитать одномерный массив - C++
С текстового файла прочитать массив. В файле: первая строчка - кол-во элементов 2 ая строчка сам массив. Посчитать сумму элементов до...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kaliban
3 / 3 / 0
Регистрация: 13.04.2012
Сообщений: 47
23.08.2014, 19:51 #2
Попробуй перезагрузить компьютер.
0
_Ivana
3147 / 1774 / 152
Регистрация: 01.03.2013
Сообщений: 4,977
Записей в блоге: 2
24.08.2014, 01:12  [ТС] #3
Собственно, я перезагрузил компьютер , дописал немножко кода и получилась почти готовая программка, решающая следующую задачу: есть некая система передачи звука по радиоканалу, для ее тестирования вход системы подключается к выходу звуковой карты компа, выход системы ко входу звуковой карты, на компе запускается эта программка, которая позволяет выбрать wav файл из каталога, загружает 10 секунд (или меньше, если файл короче) одного канала из него в память, рисует график в верхнем окне. По команде "старт" эти загруженные данные запускаются на воспроизведение, через звуковую карту идут в эфир, принимаются на вход и записываются в память и рисуется график принятого звука в нижнем окне. Графики зумятся кнопками мыши и скролятся полосой прокрутки (немножко недоделан вызов всех ее вариантов) зависимо (можно сделать независимо). Оператор глазально видит отличия в амплитудах/задержках разных графиков, подстраивает параметры системы передачи и снова нажимает старт или выбирает другой тестовый файл. При необходимости входящие данные также можно записать (пока не доделал ) в wav файл для последующего анализа в разных спектралабах. Написано на чистом С и не менее чистом winapi, использую только 2 библиотеки - WinMM.Lib для ввода/вывода аудио и comdlg32.lib для диалога выбора файла. Хотел прикрепить код, да движок форума ограничивает максимальное сообщение в 20000 символов
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 01:12
Привет! Вот еще темы с ответами:

Прочитать массив из файла и вывести на экран - C++
Дело в том что, существует массив, который мы записали в файл, есть необходимость из файла прочитать и выдать на экран. НО мой метод,...

Прочитать из текстового файла данные в массив структур - C++
Структура типа: Фамилия,логин,пароль,роль(администратор, модератор, простой пользователь) Не могу понять как прочитать из текстового...

Прочитать строку из файла и записать ее в массив структуры - C++
Подскажите как это сделать.Есть файлик со строчками,чтобы он каждую строчку считывал в массив,отличный от другого.Одна строка будет...

прочитать массив из файла и отсортировать его по возрастанию - C++
Доброго времени суток! у меня такая задача... прочитать массив из файла и отсортировать его по возрастанию. Все значения целые и по модулю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru