录音问题 [英] Audio recording problem
本文介绍了录音问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想录制麦克风的音频.如果bitwBitsPerSample
设置为8,则可以正常工作,但是如果将其设置为16,则记录文件中包含可怕的噪音,我该如何解决此问题?源代码;
hi i want to record audio from mic. if bitwBitsPerSample
set to 8, it works perfectly, but when it''s set to 16, the record file contain horrible noise, how can i solve this problem? source code;
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <aviriff.h>
#include <mmsystem.h>
//WAV format def
#define WAV_CHN 1 //mono
#define WAV_SMP 44100 //sample per sec
#define WAV_BIT 16 //bit rate
#define WAV_LENG_SEC 30 //record length(sec)
//wave buf len(channel*sample*bitrate/8*length)
#define WAVBUFFERLENGTH (WAV_CHN * WAV_SMP * (WAV_BIT / 8) * WAV_LENG_SEC)
WAVEFORMATEX g_WavFmt = {0};
//Wave header length
#define HEADERLENGTH (sizeof(RIFFLIST) + sizeof(RIFFCHUNK) + sizeof(WAVEFORMATEX) + sizeof(RIFFCHUNK))
void InitWavFmt(void)
{
g_WavFmt.wFormatTag = WAVE_FORMAT_PCM;
g_WavFmt.nChannels = WAV_CHN;
g_WavFmt.nSamplesPerSec = WAV_SMP;
g_WavFmt.wBitsPerSample = WAV_BIT;
g_WavFmt.nBlockAlign = 2;
g_WavFmt.nAvgBytesPerSec = g_WavFmt.nChannels * g_WavFmt.wBitsPerSample / 8 * g_WavFmt.nSamplesPerSec;
g_WavFmt.cbSize = 0;
}
char* AddWavHdr(char *pinBuffer, int inWavLength)
{
BYTE *pWavHdr = NULL;
RIFFLIST *pRiffWave = NULL;
RIFFCHUNK *pRiffFmt = NULL;
RIFFCHUNK *pRiffData = NULL;
char* outWavBuffer = NULL;
if (NULL == pinBuffer)
{
return NULL;
}
pWavHdr = (BYTE *)malloc(sizeof(BYTE) * HEADERLENGTH);
if ( NULL == pWavHdr)
{
return NULL;
}
else
{
memset(pWavHdr, 0, sizeof(BYTE) * HEADERLENGTH);
}
pRiffWave = (RIFFLIST*)pWavHdr;
pRiffFmt = (RIFFCHUNK*)(pRiffWave + 1);
pRiffData = (RIFFCHUNK*)(((BYTE*)(pRiffFmt + 1)) + sizeof(WAVEFORMATEX));
pRiffWave->fcc = FCC('RIFF');
pRiffWave->cb = inWavLength + HEADERLENGTH - sizeof(RIFFCHUNK);
pRiffWave->fccListType = FCC('WAVE');
pRiffFmt->fcc = FCC('fmt ');
pRiffFmt->cb = sizeof(WAVEFORMATEX);
pRiffData->fcc = FCC('data');
pRiffData->cb = inWavLength;
memcpy(pRiffFmt + 1, &g_WavFmt, pRiffFmt->cb);
outWavBuffer = (char *)malloc(sizeof(BYTE) * (inWavLength + HEADERLENGTH));
if (NULL == outWavBuffer)
{
return NULL;
}
else
{
memset(outWavBuffer, 0, sizeof(BYTE) * (inWavLength + HEADERLENGTH));
}
memcpy(outWavBuffer, pWavHdr, sizeof(BYTE) * HEADERLENGTH);
memcpy(outWavBuffer + HEADERLENGTH, pinBuffer, (sizeof(BYTE) * inWavLength));
return outWavBuffer;
}
void main ()
{
HWAVEIN hWavIn;
WAVEHDR WavHdr;
char *pBuffer = NULL;
char *pWavBuffer = NULL; MMRESULT ret;
FILE *fpPCMFile;
FILE *fpWavFile;
MMTIME MMTime = {0};
unsigned int numwritten = 0;
MMTime.wType = TIME_BYTES;
InitWavFmt();
if (0 == waveInGetNumDevs())
{
printf("Audio device not found!\n");
exit(0);
}
ret = waveInOpen(&hWavIn, WAVE_MAPPER, &g_WavFmt, 0L, 0L, WAVE_FORMAT_DIRECT);
if (MMSYSERR_NOERROR != ret)
{
printf("Unsupported WAV format.\n");
exit(0);
}
if (ret)
{
printf("Couldn't open th mic");
return;
}
ret = waveInOpen(&hWavIn, WAVE_MAPPER, &g_WavFmt, 0, 0, CALLBACK_NULL);
if (MMSYSERR_NOERROR != ret)
{
exit(0);
}
pBuffer = (char *)malloc(WAVBUFFERLENGTH);
if ( NULL != pBuffer)
{
memset(pBuffer, 0, WAVBUFFERLENGTH);
}
else
{
exit(0);
}
WavHdr.lpData = pBuffer;
WavHdr.dwBufferLength = WAVBUFFERLENGTH;
WavHdr.dwBytesRecorded = 0;
WavHdr.dwUser = 0;
WavHdr.dwFlags = 0;
WavHdr.dwLoops = 1;
WavHdr.lpNext = 0;
WavHdr.reserved = 0;
ret = waveInPrepareHeader(hWavIn,&WavHdr,sizeof(WAVEHDR));
if (MMSYSERR_NOERROR != ret)
{
free(pBuffer);
exit(0);
}
ret = waveInAddBuffer(hWavIn, &WavHdr, sizeof(WAVEHDR));
if (MMSYSERR_NOERROR != ret)
{
free(pBuffer);
exit(0);
}
printf ("Press any key to start recording...\n");
getch();
printf ("Recording now\n");
ret = waveInStart(hWavIn);
if (MMSYSERR_NOERROR != ret)
{
free(pBuffer);
exit(0);
}
printf ("Press any key to stop Recording\n");
getch();
waveInGetPosition(hWavIn, &MMTime, sizeof(MMTime));
waveInReset(hWavIn);
waveInUnprepareHeader(hWavIn,&WavHdr,sizeof(WAVEHDR));
waveInClose(hWavIn);
fpPCMFile = fopen("pcm","w");
if (NULL == fpPCMFile)
{
printf("Creating PCM file failed\n");
free(pBuffer);
exit(0);
}
numwritten = fwrite(pBuffer, sizeof(char), MMTime.u.cb, fpPCMFile);
printf ("Recording done, %d bytes recorded, %d bytes written\n", MMTime.u.cb, numwritten);
fclose(fpPCMFile);
pWavBuffer = AddWavHdr(pBuffer, MMTime.u.cb);
if ( NULL == pWavBuffer)
{
printf("Add header failed\n");
}
else
{
fpWavFile = fopen("wave.wav", "w");
if (NULL == fpWavFile)
{
printf("Creating WAV file failed\n");
}
else
{
numwritten = fwrite(pWavBuffer, sizeof(char), sizeof(BYTE) * (HEADERLENGTH + MMTime.u.cb), fpWavFile);
printf("%d bytes of WAV file written\n", numwritten);
fclose(fpWavFile);
free(pWavBuffer);
}
}
//PlaySound(TEXT("wave.wav"), NULL, SND_FILENAME);
free(pBuffer);
getch();
return;
}
推荐答案
尝试减小WAV_SMP值
每秒的采样数..
:cool :: cool :: cool:
Try reducing the WAV_SMP value
Which is the samples per second ..
:cool::cool::cool:
这篇关于录音问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文