Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
84 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 93

Запись звука в массив и в файл wav

11.10.2015, 21:48. Показов 4949. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Такой вопрос. Вот мне нужно записать звук по нажатию кнопки (пусть будет пробела) и занести записанное в массив по формату double чисел (как если бы я считывала из wav файла) и после этого записать все это в wav файл.
Желательно пользоваться как можно меньше сторонними библиотеками (а в идеале написать так, чтобы можно было запустить на windows и на linux).

Помогите, кто чем может

Два примера особо ничем не помогли.

Пример 1. Записывает и выводит звук.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
WAVEFORMATEX pFormat;
    pFormat.wFormatTag = WAVE_FORMAT_PCM;     // simple, uncompressed format
    pFormat.nChannels = 2;                    //  1=mono, 2=stereo
    pFormat.wBitsPerSample = 16;              //  16 for high quality, 8 for telephone-grade
    pFormat.nSamplesPerSec = sampleRate;
    pFormat.nAvgBytesPerSec = sampleRate * pFormat.nChannels * pFormat.wBitsPerSample / 8;
    pFormat.nBlockAlign = pFormat.nChannels * pFormat.wBitsPerSample / 8;
    pFormat.cbSize = 0;
 
    HWAVEIN hWaveIn;
    WAVEHDR waveInHdr;
 
    waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0L, 0L, WAVE_FORMAT_DIRECT);
 
    //waveInHdr.lpData = (LPSTR)waveIn;
    waveInHdr.lpData = (LPSTR)waveIn;
    waveInHdr.dwBufferLength = NUMPTS * 2;
    waveInHdr.dwBytesRecorded = 0;
    waveInHdr.dwUser = 0L;
    waveInHdr.dwFlags = 0L;
    waveInHdr.dwLoops = 0L;
 
    waveInPrepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR));
 
    waveInAddBuffer(hWaveIn, &waveInHdr, sizeof(WAVEHDR));
 
    waveInStart(hWaveIn);
 
    // Wait until finished recording
    do{} while (waveInUnprepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
 
    waveInClose(hWaveIn);
 
    HWAVEOUT hWaveOut;
    WAVEHDR WaveOutHdr;
 
    waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, 0L, 0L, WAVE_FORMAT_DIRECT);
 
    WaveOutHdr.lpData = (LPSTR)waveIn;
    WaveOutHdr.dwBufferLength = NUMPTS * 2;
    WaveOutHdr.dwBytesRecorded = 0;
    WaveOutHdr.dwUser = 0L;
    WaveOutHdr.dwFlags = 0L;
    WaveOutHdr.dwLoops = 1L;
 
    waveOutPrepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));
 
    waveOutSetVolume(hWaveOut, 0xFFFFFFFF);
 
    waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR));
 
    waveOutClose(hWaveOut);
 
    system("pause");
Пример 2. Пишет в wav но неправильно, файл не открывается и массив из 0.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
WAVEFORMATEX pFormat;
    pFormat.wFormatTag = WAVE_FORMAT_PCM;     // simple, uncompressed format
    pFormat.nChannels = 1;                    //  1=mono, 2=stereo
    pFormat.wBitsPerSample = 16;              //  16 for high quality, 8 for telephone-grade
    pFormat.nSamplesPerSec = sampleRate;
    pFormat.nAvgBytesPerSec = sampleRate * pFormat.nChannels * pFormat.wBitsPerSample / 8;
    pFormat.nBlockAlign = pFormat.nChannels * pFormat.wBitsPerSample / 8;
    pFormat.cbSize = 0;
 
    HWAVEIN hWaveIn;
    WAVEHDR waveInHdr;
 
    waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0L, 0L, WAVE_FORMAT_DIRECT);
 
    waveInHdr.lpData = (LPSTR)waveIn;
    waveInHdr.dwBufferLength = NUMPTS * 2;
    waveInHdr.dwBytesRecorded = 0;
    waveInHdr.dwUser = 0L;
    waveInHdr.dwFlags = 0L;
    waveInHdr.dwLoops = 0L;
 
    waveInPrepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR));
 
    waveInAddBuffer(hWaveIn, &waveInHdr, sizeof(WAVEHDR));
 
    waveInStart(hWaveIn);
 
    // Wait until finished recording
    do{} while (waveInUnprepareHeader(hWaveIn, &waveInHdr, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);
    short int buf[NUMPTS];
 
    waveInClose(hWaveIn);
    //сохраняем записанный файл
 
    struct WAVHEADER
    {
        char chunkId[4];
        unsigned long chunkSize;
        char format[4];
        char subchunk1Id[4];
 
        unsigned long subchunk1Size;
        unsigned short audioFormat;
        unsigned short numChannels;
        unsigned long sampleRate;
        unsigned long byteRate;
        unsigned short blockAlign;
        unsigned short bitsPerSample;
        char subchunk2Id[4];
        unsigned long subchunk2Size;
 
    }header;
 
    header.subchunk2Size = sizeof(waveIn);
    header.chunkId[4] = *"RIFF";
    header.chunkSize = header.subchunk2Size + 136;
    header.format[4] = *"WAVE";
    header.subchunk1Id[4] = *"fmt ";
    header.subchunk1Size = 16;
    header.audioFormat = pFormat.wFormatTag;
    header.sampleRate = sampleRate;
    header.bitsPerSample = pFormat.wBitsPerSample;
    header.numChannels = pFormat.nChannels;
    header.byteRate = pFormat.nAvgBytesPerSec;
 
    header.blockAlign = pFormat.nBlockAlign;
    header.subchunk2Id[4] = *"data";
 
    FILE* pf; fopen_s(&pf, "zap1.wav", "wb");
    fwrite((HPSTR)&header, sizeof(WAVHEADER), 1, pf);
    fwrite((HPSTR)waveIn, 2, sizeof(waveIn), pf);
    fclose(pf);
 
    //WAVHEADER header;
    //вывод всех параметров записи
    FILE *file;
    errno_t err;
    err = fopen_s(&file, "zap1.wav", "rb");
    if (err)
    {
        printf_s("Failed open file, error %d", err);
    }
    fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);
    printf_s("chunkid %d\n", header.chunkId);
    printf_s("chunksize %d\n", header.chunkSize);
    printf_s("format %d\n", header.format);
    printf_s("subchunk1id %d\n", header.subchunk1Id);
    printf_s("subchunk1size: %d\n", header.subchunk1Size);
    printf_s("audioformat: %d\n", header.audioFormat);
    printf_s("blockalign: %d\n", header.blockAlign);
    printf_s("subchunk2Id: %d\n", header.subchunk2Id);
    printf_s("subchunk2size: %d\n", header.subchunk2Size);
    printf_s("Sample rate: %d\n", header.sampleRate);
    printf_s("Channels: %d\n", header.numChannels);
    printf_s("Bits per sample: %d\n", header.bitsPerSample);
    printf_s("Byterate %d\n", header.byteRate);
 
    fclose(file);
 
    system("pause");
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2015, 21:48
Ответы с готовыми решениями:

Запись звука с микрофона в файл WAV
Здравствуйте друзья! Думаю многим начинающим программистам Delphi будет интересна эта тема. К делу! В общем пытаюсь средствами API Windows...

Запись звука с микрофона в файл WAV
Здравствуйте друзья! Думаю многим начинающим программистам Delphi будет интересна эта тема. К делу! В общем пытаюсь средствами API Windows...

Запись звука с микрофона и сохранение в wav
Добрый день, как записать wav файл с микрофона? Частота дискретизации = 122кб/с моно. Спасибо.

2
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
11.10.2015, 23:53
Цитата Сообщение от Trisha Ray Посмотреть сообщение
Желательно пользоваться как можно меньше сторонними библиотеками (а в идеале написать так, чтобы можно было запустить на windows и на linux)
вот как раз таки сторонними библиотеками кроссплатформенность достигается попроще
0
84 / 4 / 0
Регистрация: 01.02.2012
Сообщений: 93
12.10.2015, 07:23  [ТС]
OstapBender, к сожалению, нет возможности ставить доп библиотеки, т.к. стенд на котором будет работать программа (внутри которой реализовывается данный момент) не позволит ничего лишнего ставить а конечная ОС неизвестна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2015, 07:23
Помогаю со студенческими работами здесь

Как сделать запись звука в Паскале в wav?
как сделать запись звука в паскале в waw просто код диктофона без кнопок и т.д я видел на форуме 1 диктофон где библиотека bass и куча доп...

Запись Wav в файл
Пишу на C#. Имеется написанный код для записи звука с микрофона в поток(исходник будет ниже). Мне надо сохранить его в файл формата Wav...

Запись и считывание информации в WAV-файл
Всем добрый день. Занимаюсь такой проблемой: необходимо записать в звуковой файл и считать из него определенную последовательность. При...

Запись с использованием QMediaRecorder в файл *.wav и отправка этого файла на адрес http://
На отправку на веб-адрес не обращайте внимание (забыл стереть) Нужно записать звук с микрофона в wav (а лучше сразу в flac) файл с...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru