gpt4 book ai didi

c - 尝试编写通过 WinAPI 录制和播放声音的函数

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:40 24 4
gpt4 key购买 nike

我正在尝试在 C 中创建 2 个函数:

  • 对麦克风进行 X 秒录音
  • 获取录音并将其播放给用户

这是我写的:

#include <iostream>
#include <Windows.h>
using namespace std;

#pragma comment(lib, "winmm.lib")

WAVEHDR StartRecord(int seconds)
{
const int NUMPTS = 44100 * seconds;
int sampleRate = 44100;
short int *waveIn = new short int[NUMPTS];

HWAVEIN hWaveIn;
WAVEHDR WaveInHdr;
MMRESULT result;

WAVEFORMATEX pFormat;
pFormat.wFormatTag = WAVE_FORMAT_PCM;
pFormat.nChannels = 1;
pFormat.nSamplesPerSec = sampleRate;
pFormat.nAvgBytesPerSec = 2 * sampleRate;
pFormat.nBlockAlign = 2;
pFormat.wBitsPerSample = 16;
pFormat.cbSize = 0;

result = waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT);

if(result)
{
char fault[256];
waveInGetErrorTextA(result, fault, 256);
MessageBoxA(NULL, fault, "Failed to open waveform input device.", MB_OK | MB_ICONEXCLAMATION);
}

WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = 2 * NUMPTS;
WaveInHdr.dwBytesRecorded = 0;
WaveInHdr.dwUser = 0;
WaveInHdr.dwFlags = 0;
WaveInHdr.dwLoops = 0;
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));

result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
if(result)
{
MessageBoxA(NULL, "Failed to read block from device", NULL, MB_OK | MB_ICONEXCLAMATION);
}

result = waveInStart(hWaveIn);
if(result)
{
MessageBoxA(NULL, "Failed to start recording", NULL, MB_OK | MB_ICONEXCLAMATION);
}

cout << "Recording..." << endl;
Sleep(seconds * 1000); //Sleep while recording

return WaveInHdr;

}

void PlayRecord(WAVEHDR WaveInHdr, int seconds)
{
WAVEFORMATEX pFormat;
pFormat.wFormatTag = WAVE_FORMAT_PCM;
pFormat.nChannels = 1;
pFormat.nSamplesPerSec = 44100;
pFormat.nAvgBytesPerSec = 2 * 44100;
pFormat.nBlockAlign = 2;
pFormat.wBitsPerSample = 16;
pFormat.cbSize = 0;

HWAVEOUT hWaveOut;

if(waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT))
{
MessageBoxA(NULL, "Failed to replay", NULL, MB_OK | MB_ICONEXCLAMATION );
}

waveOutWrite(hWaveOut, &WaveInHdr, sizeof(WaveInHdr)); // Playing the data
Sleep(seconds * 1000); //Sleep for as long as there was recorded
}

int main()
{
PlayRecord(StartRecord(3), 3);
return 0;
}

代码有什么问题?为什么它不起作用?我好像什么都听不见...

此外,是否有一个选项可以录制麦克风,而不是 X 秒,例如,直到没有来自麦克风的输入(例如 - 开始录制,我正在对着麦克风说一句话,当有一两秒钟的沉默时,它会停止录音或其他什么?)

谢谢!

最佳答案

回复:录音直到没有来自麦克风的输入。是的,准备几个缓冲区并在 WaveInStart 之前用每个缓冲区调用 waveInAddBuffer。 WaveIn 将连续并按顺序填充缓冲区,并在填充时将它们返回给您。您将需要使用 WaveIn 提供的通知之一来了解缓冲区何时已满。检查缓冲区数据以决定何时停止。如果您想继续前进,请将每个已填充的缓冲区返回给 WaveIn,只要您愿意,它就会继续填充它们。

关于c - 尝试编写通过 WinAPI 录制和播放声音的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21741194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com