音频信息的采集和播放,但是不可以播放
我想实现的是:一边录音,一边播放,但是现在没有声音,跟踪了一下,除了第一次进入writeaudioblock,进不去了,
void writeAudioBlock(HWAVEOUT hWaveOut, LPSTR block, DWORD size)
{
WAVEHDR header;
ZeroMemory(&header, sizeof(WAVEHDR));
header.dwBufferLength = size; //length, in bytes, of the buffer.
header.lpData = block; // pointer to waveform buffer.
waveOutPrepareHeader(hWaveOut, &header, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &header, sizeof(WAVEHDR));
Sleep(500);
while(waveOutUnprepareHeader(hWaveOut, &header, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING)//release buffer
Sleep(100);
}
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2) //反馈函数
{
if (uMsg == WIM_OPEN)
{
}
else
if (uMsg == WIM_DATA)
{
//realloc buffer for record ,and delete it when after playing
lpNewBuffer = (char *)realloc(lpSaveBuffer,dwDataLength + ((PWAVEHDR)dwParam1)->dwBytesRecorded);
if (lpNewBuffer ==NULL)
{
// waveInClose(hWaveIn);
MessageBox(NULL,"error with lpNewBuffer",NULL,MB_OK);
}
lpSaveBuffer = lpNewBuffer;
CopyMemory(lpSaveBuffer + dwDataLength, ((PWAVEHDR)dwParam1)->lpData,((PWAVEHDR)dwParam1)->dwBufferLength );
dwDataLength +=((PWAVEHDR)dwParam1)->dwBytesRecorded ;
MMRESULT i4 = waveInAddBuffer(hWaveIn,(PWAVEHDR)dwParam1,sizeof(WAVEHDR));
return;
}
else if (uMsg == WIM_CLOSE)
{
//waveInUnprepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
free (lpBuffer1);
}
}
int DoRecord()
{
pWaveHdr1 = (PWAVEHDR)malloc(sizeof(WAVEHDR));
lpBuffer1 = (char*)malloc(16384);
//open waveform audio for input
waveform.wFormatTag = WAVE_FORMAT_PCM;
waveform.nChannels = 1;
waveform.nSamplesPerSec = 8000;
waveform.wBitsPerSample = 16;
waveform.cbSize = 0;
waveform.nBlockAlign = (waveform.nChannels * waveform.wBitsPerSample)/8;
waveform.nAvgBytesPerSec = (waveform.nSamplesPerSec*waveform.nBlockAlign);
MMRESULT inflag = waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)waveInProc,0,
CALLBACK_FUNCTION); //open input device
//setup the headers and prepare them
pWaveHdr1->lpData = lpBuffer1;
pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE;
pWaveHdr1->dwBytesRecorded = 0;
pWaveHdr1->dwUser = 0;
pWaveHdr1->dwFlags = 0;
pWaveHdr1->dwLoops = 1;
pWaveHdr1->lpNext = NULL;
pWaveHdr1->reserved = 0;
MMRESULT inpreflag= waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
lpSaveBuffer = (char*)malloc(1);
//add the record buffers
MMRESULT inaddflag = waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
dwDataLength = 0;
//begin sampling(开始采样)
MMRESULT instartflag = waveInStart(hWaveIn);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DoPlay,0,0,0);
return 0;
}
UINT DoPlay()
{
MMRESULT outmark = waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,0,0,
CALLBACK_NULL);
block = lpSaveBuffer;
blockSize=dwDataLength;
writeAudioBlock(hWaveOut,block,blockSize);
//waveOutClose(hWaveOut);
return 0;
}
void writeAudioBlock(HWAVEOUT hWaveOut, LPSTR block, DWORD size)
{
WAVEHDR header;
ZeroMemory(&header, sizeof(WAVEHDR));
header.dwBufferLength = size; //length, in bytes, of the buffer.
header.lpData = block; // pointer to waveform buffer.
waveOutPrepareHeader(hWaveOut, &header, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &header, sizeof(WAVEHDR));
Sleep(500);
while(waveOutUnprepareHeader(hWaveOut, &header, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING)//release buffer
Sleep(100);
}
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2) //反馈函数
{
if (uMsg == WIM_OPEN)
{
}
else
if (uMsg == WIM_DATA)
{
//realloc buffer for record ,and delete it when after playing
lpNewBuffer = (char *)realloc(lpSaveBuffer,dwDataLength + ((PWAVEHDR)dwParam1)->dwBytesRecorded);
if (lpNewBuffer ==NULL)
{
// waveInClose(hWaveIn);
MessageBox(NULL,"error with lpNewBuffer",NULL,MB_OK);
}
lpSaveBuffer = lpNewBuffer;
CopyMemory(lpSaveBuffer + dwDataLength, ((PWAVEHDR)dwParam1)->lpData,((PWAVEHDR)dwParam1)->dwBufferLength );
dwDataLength +=((PWAVEHDR)dwParam1)->dwBytesRecorded ;
MMRESULT i4 = waveInAddBuffer(hWaveIn,(PWAVEHDR)dwParam1,sizeof(WAVEHDR));
return;
}
else if (uMsg == WIM_CLOSE)
{
//waveInUnprepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
free (lpBuffer1);
}
}
int DoRecord()
{
pWaveHdr1 = (PWAVEHDR)malloc(sizeof(WAVEHDR));
lpBuffer1 = (char*)malloc(16384);
//open waveform audio for input
waveform.wFormatTag = WAVE_FORMAT_PCM;
waveform.nChannels = 1;
waveform.nSamplesPerSec = 8000;
waveform.wBitsPerSample = 16;
waveform.cbSize = 0;
waveform.nBlockAlign = (waveform.nChannels * waveform.wBitsPerSample)/8;
waveform.nAvgBytesPerSec = (waveform.nSamplesPerSec*waveform.nBlockAlign);
MMRESULT inflag = waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)waveInProc,0,
CALLBACK_FUNCTION); //open input device
//setup the headers and prepare them
pWaveHdr1->lpData = lpBuffer1;
pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE;
pWaveHdr1->dwBytesRecorded = 0;
pWaveHdr1->dwUser = 0;
pWaveHdr1->dwFlags = 0;
pWaveHdr1->dwLoops = 1;
pWaveHdr1->lpNext = NULL;
pWaveHdr1->reserved = 0;
MMRESULT inpreflag= waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
lpSaveBuffer = (char*)malloc(1);
//add the record buffers
MMRESULT inaddflag = waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
dwDataLength = 0;
//begin sampling(开始采样)
MMRESULT instartflag = waveInStart(hWaveIn);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DoPlay,0,0,0);
return 0;
}
UINT DoPlay()
{
MMRESULT outmark = waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,0,0,
CALLBACK_NULL);
block = lpSaveBuffer;
blockSize=dwDataLength;
writeAudioBlock(hWaveOut,block,blockSize);
//waveOutClose(hWaveOut);
return 0;
}
...全文
相关推荐
使用低级音频函数实现音频采集与播放
### 使用低级音频函数实现音频采集与播放#### 摘要随着信息技术的发展和多媒体技术的广泛应用,处理视频和音频数据的需求日益增加。
【ffmpeg】音频采集
ffmpeg命令采集+ffmpeg API采集 📦个人主页:一二三o-0-O的博客 🏆技术方向:C/C++客户端资深工程师(直播+音视频剪辑) 👨💻作者简介:数据结构算法与音视频领域创作者 📒 系列专栏:ffmpeg入门 📣专栏目标:务实的掌握FFmpeg相关专业知识 🧡如果对您有帮助的话,欢迎点赞👍收藏📂,关注不迷路
浏览器播放PCM音频[源码]
这些元数据信息包括了采样率、采样大小、通道数等关键参数,浏览器可以通过这些信息准确地解析和播放WAV格式的音频。
音频采集编辑C++程序
《音频采集编辑C++程序详解》在信息技术领域,音频采集和编辑是至关重要的环节,尤其是在多媒体应用、游戏开发以及音频处理软件中。
C++音频采集程序.rar
**文件I/O操作**:如果要将采集的音频保存到文件,就需要掌握文件I/O操作,包括读写二进制文件、了解文件头信息以便正确解析和生成音频文件。10.


网络编程
