录音问题 [英] Audio recording problem

查看:122
本文介绍了录音问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想录制麦克风的音频.如果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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆