获取以Real Time C ++录制的音频数据

时间:2016-11-04 15:33:14

标签: c++ real-time audio-recording

我发现下面的代码记录并播放3秒内录制的波形。我想实时处理音频数据,配置为Fs = 8000 Hz,buffersize = 80个样本,这意味着一帧持续时间= 0.01秒,我想得到(读取80个样本并应用我的工作)这样的事情:

  1. 开始记录
  2. 每0.01秒getData并将其存储在矢量[80]
  3. myresult = myFct(vector [80])
  4. 结束记录(如果条件结束时间)。
  5. 所以问题在于第三,通过阅读一些文档,似乎我应该使用线程来获取getData。请问有什么建议吗?

    // RecPlayThreeSec.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <Windows.h>
    using namespace std;
    
    #pragma comment(lib, "winmm.lib")
    
    short int waveIn[8000 * 3];
    
    void PlayRecord();
    void writedataTofile(LPSTR lpData, DWORD dwBufferLength);
    
    void StartRecord()
    {
        const int NUMPTS = 8000 * 3;   // 3 seconds
        int sampleRate = 8000;
        // 'short int' is a 16-bit type; I request 16-bit samples below
        // for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit     types
    
        HWAVEIN      hWaveIn;
        MMRESULT result;
    
        WAVEFORMATEX pFormat;
        pFormat.wFormatTag = WAVE_FORMAT_PCM;     // simple, uncompressed format
        pFormat.nChannels = 1;                    //  1=mono, 2=stereo
        pFormat.nSamplesPerSec = sampleRate;      // 8.0 kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz
        pFormat.nAvgBytesPerSec = sampleRate * 2;   // =  nSamplesPerSec × nBlockAlign
        pFormat.nBlockAlign = 2;                  // = (nChannels × wBitsPerSample) / 8
        pFormat.wBitsPerSample = 16;              //  16 for high quality, 8 for telephone-grade
        pFormat.cbSize = 0;
    
        // Specify recording parameters
    
        result = waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat,
            0L, 0L, WAVE_FORMAT_DIRECT);
    
        WAVEHDR      WaveInHdr;
        // Set up and prepare header for input
        WaveInHdr.lpData = (LPSTR)waveIn;
        WaveInHdr.dwBufferLength = NUMPTS * 2;
        WaveInHdr.dwBytesRecorded = 0;
        WaveInHdr.dwUser = 0L;
        WaveInHdr.dwFlags = 0L;
        WaveInHdr.dwLoops = 0L;
        waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
    
        // Insert a wave input buffer
        result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
    
    
        // Commence sampling input
        result = waveInStart(hWaveIn);
    
    
        cout << "recording..." << endl;
    
        Sleep(3 * 1000);
        // Wait until finished recording
    
        waveInClose(hWaveIn);
        PlayRecord();
    }
    
    void PlayRecord()
    {
        const int NUMPTS = 8000 * 3;   // 3 seconds
        int sampleRate = 8000;
        // 'short int' is a 16-bit type; I request 16-bit samples below
        // for 8-bit capture, you'd    use 'unsigned char' or 'BYTE' 8-bit types
    
        HWAVEIN  hWaveIn;
    
        WAVEFORMATEX pFormat;
        pFormat.wFormatTag = WAVE_FORMAT_PCM;     // simple, uncompressed format
        pFormat.nChannels = 1;                    //  1=mono, 2=stereo
        pFormat.nSamplesPerSec = sampleRate;      // 44100
        pFormat.nAvgBytesPerSec = sampleRate * 2;   // = nSamplesPerSec * n.Channels * wBitsPerSample/8
        pFormat.nBlockAlign = 2;                  // = n.Channels * wBitsPerSample/8
        pFormat.wBitsPerSample = 16;              //  16 for high quality, 8 for telephone-grade
        pFormat.cbSize = 0;
    
        // Specify recording parameters
    
        waveInOpen(&hWaveIn, WAVE_MAPPER, &pFormat, 0L, 0L, WAVE_FORMAT_DIRECT);
    
        WAVEHDR      WaveInHdr;
        // Set up and prepare header for input
        WaveInHdr.lpData = (LPSTR)waveIn;
        WaveInHdr.dwBufferLength = NUMPTS * 2;
        WaveInHdr.dwBytesRecorded = 0;
        WaveInHdr.dwUser = 0L;
        WaveInHdr.dwFlags = 0L;
        WaveInHdr.dwLoops = 0L;
        waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
    
        HWAVEOUT hWaveOut;
        cout << "playing..." << endl;
        waveOutOpen(&hWaveOut, WAVE_MAPPER, &pFormat, 0, 0, WAVE_FORMAT_DIRECT);
        waveOutWrite(hWaveOut, &WaveInHdr, sizeof(WaveInHdr)); // Playing the data
        Sleep(3 * 1000); //Sleep for as long as there was recorded
    
    
        waveInClose(hWaveIn);
        waveOutClose(hWaveOut);
    }
    int main()
    {
        StartRecord();
        return 0;
    }
    

0 个答案:

没有答案