改进上面的代码使他能将录制的音频文件保存
时间: 2024-04-12 16:32:19 浏览: 17
要改进代码以将录制的音频文件保存到磁盘上,您可以使用 Windows Multimedia API 中的 `waveInOpen`、`waveInPrepareHeader`、`waveInAddBuffer`、`waveInStart` 等函数来录制音频,并使用 `waveOutOpen`、`waveOutPrepareHeader`、`waveOutWrite` 等函数来播放音频。
以下是一个示例代码,演示了如何录制音频并将其保存到文件中:
```c
#include <Windows.h>
#include <mmsystem.h>
#include <stdio.h>
#define NUM_BUFFERS 3
#define BUFFER_SIZE 4096
HWAVEIN hWaveIn;
WAVEHDR waveHeaders[NUM_BUFFERS];
FILE* file;
void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2) {
if (uMsg == WIM_DATA) {
LPWAVEHDR pWaveHdr = (LPWAVEHDR)dwParam1;
fwrite(pWaveHdr->lpData, pWaveHdr->dwBytesRecorded, 1, file);
waveInAddBuffer(hwi, pWaveHdr, sizeof(WAVEHDR));
}
}
int main() {
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = 1;
wfx.nSamplesPerSec = 44100;
wfx.wBitsPerSample = 16;
wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
wfx.cbSize = 0;
file = fopen("recorded_audio.wav", "wb");
if (file == NULL) {
printf("Failed to create file!\n");
return 1;
}
waveInOpen(&hWaveIn, WAVE_MAPPER, &wfx, (DWORD_PTR)waveInProc, 0, CALLBACK_FUNCTION);
for (int i = 0; i < NUM_BUFFERS; i++) {
waveHeaders[i].lpData = new char[BUFFER_SIZE];
waveHeaders[i].dwBufferLength = BUFFER_SIZE;
waveHeaders[i].dwBytesRecorded = 0;
waveHeaders[i].dwUser = 0;
waveHeaders[i].dwFlags = 0;
waveHeaders[i].dwLoops = 0;
waveInPrepareHeader(hWaveIn, &waveHeaders[i], sizeof(WAVEHDR));
waveInAddBuffer(hWaveIn, &waveHeaders[i], sizeof(WAVEHDR));
}
waveInStart(hWaveIn);
printf("Recording audio... Press Enter to stop.\n");
getchar();
waveInClose(hWaveIn);
fclose(file);
for (int i = 0; i < NUM_BUFFERS; i++) {
delete[] waveHeaders[i].lpData;
waveInUnprepareHeader(hWaveIn, &waveHeaders[i], sizeof(WAVEHDR));
}
return 0;
}
```
上述代码会录制音频并将其保存到名为 `recorded_audio.wav` 的文件中。您可以根据需要修改音频的格式和文件名。请确保在使用 `waveInOpen` 函数时提供正确的回调函数,并在回调函数中将录制的音频写入文件中。