lm68140318 发表于 2023-8-16 13:31:52

波形图 不连续


// ************定义全局变量*************
#define NUM_SAMPLES 1024
HWAVEIN hWaveIn;
WAVEFORMATEX waveform;
short g_samples;
//位深=16,每个采样点两个字节
WAVEHDR waveHeader;
int zong = 0;
CWnd* pWnd;//picture控件句柄
HWND hWnd;
HDC hdc;
HPEN hpen;
HPEN oldhpen;
RECT rect;
HBRUSH hbr;
HBRUSH oldhbr;
HANDLE mutex;//互斥锁句柄
int beisu ;//纵向缩小倍数
int beisu1;//横向放大倍数倍数

int nReturn;
WAVEINCAPS* pwic;
int suoyin = 0;//麦克风ID


// TODO: 在此添加额外的初始化代码

        // 设置音频格式
        waveform.wFormatTag = WAVE_FORMAT_PCM;
        waveform.nChannels = 1;   // 声道数
        waveform.nSamplesPerSec = 44100;   // 采样频率
        waveform.wBitsPerSample = 16;   // 位深
       
        waveform.nBlockAlign = waveform.nChannels * (waveform.wBitsPerSample / 8);
        waveform.nAvgBytesPerSec = waveform.nSamplesPerSec * waveform.nBlockAlign;
        waveform.cbSize = 0;

        //创建并准备缓冲区
        waveHeader.lpData = (LPSTR)g_samples;
        waveHeader.dwBufferLength = NUM_SAMPLES * sizeof(short);
        waveHeader.dwBytesRecorded = 0;
        waveHeader.dwUser = 0;
        waveHeader.dwFlags = 0;
        waveHeader.dwLoops = 0;
        pWnd = GetDlgItem(IDC_SOUND);//获取picture控件句柄
        hWnd = ::GetDlgItem(GetSafeHwnd(), IDC_SOUND);
        hdc = ::GetDC(hWnd);
        hpen = CreatePen(PS_SOLID, 2, RGB(0, 0, 255));//创建画笔
        oldhpen= (HPEN)SelectObject(hdc, hpen);
        ::GetClientRect(hWnd, &rect);//获取picture控件客户区的坐标
        hbr = CreateSolidBrush(RGB(255, 255, 255));
        oldhbr =(HBRUSH)SelectObject(hdc, hbr);
        FillRect(hdc, &rect, hbr);//绘制并填充矩形

        myspin.SetRange32(0, 1000);    //调节的范围
        myspin.SetBase(10); //十进制
        myspin.SetBuddy(GetDlgItem(IDC_EDIT1));    //设置关联的编辑框
        myspin.SetPos(200);//设置当前值
        beisu = 200;
        beisu1 = 6;

        int nReturn = waveInGetNumDevs();//获取系统中存在的波形音频输入设备数
        if (nReturn==0) {
                AfxMessageBox(_T("请插入麦克风!"));
                return 0;
        }

        pwic = new WAVEINCAPS;
        for (int i = 0; i < nReturn; i++) {
                MMRESULT mmresult = waveInGetDevCaps(i, (pwic+i), sizeof(WAVEINCAPS)); //获取给定的波形音频输入设备的信息
                m_cmbRec.AddString(pwic->szPname);
                //m_cmbRec下拉列表框变量名
        }

        m_cmbRec.SetCurSel(0);
        suoyin= m_cmbRec.GetCurSel();//获取选中项的索引号









我的问题:我采集麦克风音频,画出波形图,可是 波形图 不连续??


isdkz 发表于 2023-8-16 13:32:16

你的问题可能是由于采集音频数据的方式不正确导致的。在你的代码中,你使用了 waveInGetNumDevs 来获取系统中存在的波形音频输入设备数,并使用 waveInGetDevCaps 获取每个设备的信息。然后,你使用 waveInOpen 打开设备,并使用 waveInPrepareHeader 和 waveInAddBuffer 准备和添加缓冲区。最后,你使用 waveInStart 开始采集音频数据。

然而,在你的代码中,我没有看到你使用 waveInStart 来开始采集音频数据。这可能是导致波形图不连续的原因之一。你需要在准备好缓冲区后,调用 waveInStart 来开始采集音频数据。

另外,你的代码中没有显示你如何处理采集到的音频数据。你需要在采集到音频数据后,对数据进行处理并更新波形图的显示。你可以使用 waveInProc 回调函数来处理采集到的音频数据,并在回调函数中更新波形图的显示。

你可以尝试在适当的位置调用 waveInStart 来开始采集音频数据,并在 waveInProc 回调函数中处理和更新波形图的显示,以解决波形图不连续的问题。
页: [1]
查看完整版本: 波形图 不连续