获取pcm文件
SoundRecord* g_sound=nullptr;
#pragma comment(lib, "winmm.lib")
DWORD CALLBACK MicCallback(HWAVEIN hwavein, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
switch (uMsg) {
case WIM_OPEN:
LOGXD("The device is on ...");
break;
case WIM_DATA: {
if (g_sound)g_sound->getDealFun()(hwavein, uMsg, dwInstance, dwParam1, dwParam2, g_sound->getRunState());
waveInAddBuffer(hwavein, (LPWAVEHDR)dwParam1, sizeof(WAVEHDR));
break;
}
case WIM_CLOSE:
LOGXD("The equipment has been shut down. ...");
break;
default:
break;
}
return 0;
}
void SoundRecord::getPcm(int _rate, int _channel, int _bit_size, std::function<void(HWAVEIN, UINT, DWORD, DWORD, DWORD, bool& is_run)> _fun) {
do {
//1.get info
int count = waveInGetNumDevs();//1
LOGXD("n Audio input quantity: ", VAR_DATA(count));
if (count <= 0)break;
WAVEINCAPS waveIncaps;
MMRESULT mmResult = waveInGetDevCaps(0, &waveIncaps, sizeof(WAVEINCAPS));//2
LOGXD("Audio input equipment:", VAR_DATA(waveIncaps.szPname));
if (mmResult != MMSYSERR_NOERROR)break;
//2.init wave_format
WAVEFORMATEX pwfx;
pwfx.wFormatTag = WAVE_FORMAT_PCM;
pwfx.nChannels = _channel;
pwfx.nSamplesPerSec = _rate;
pwfx.wBitsPerSample = _bit_size;
pwfx.nBlockAlign = pwfx.nChannels * pwfx.wBitsPerSample / 8;
pwfx.nAvgBytesPerSec = pwfx.nSamplesPerSec * pwfx.nBlockAlign;
pwfx.cbSize = 0;
//3.open device and ready buf
HWAVEIN phwi;
LOGXD("Request to open audio input device ");
LOGXD(VAR_DATA(pwfx.nChannels), VAR_DATA(pwfx.nBlockAlign), VAR_DATA(pwfx.nSamplesPerSec));
mmResult = waveInOpen(&phwi, WAVE_MAPPER, &pwfx, (DWORD)(MicCallback), NULL, CALLBACK_FUNCTION);//3
if (MMSYSERR_NOERROR != mmResult)break;
int buf_size = pwfx.nAvgBytesPerSec * 2;
WAVEHDR pwh1;
unique_ptr<char[]> buffer1 = make_unique<char[]>(buf_size);
pwh1.lpData = buffer1.get();
pwh1.dwBufferLength = buf_size;
pwh1.dwUser = 1;
pwh1.dwFlags = 0;
mmResult = waveInPrepareHeader(phwi, &pwh1, sizeof(WAVEHDR));
LOGXD("Standby buffer 1");
WAVEHDR pwh2;
unique_ptr<char[]> buffer2 = make_unique<char[]>(buf_size);
pwh2.lpData = buffer2.get();
pwh2.dwBufferLength = buf_size;
pwh2.dwUser = 2;
pwh2.dwFlags = 0;
mmResult = waveInPrepareHeader(phwi, &pwh2, sizeof(WAVEHDR));
LOGXD("Standby buffer 2");
//4.start get
if (MMSYSERR_NOERROR != mmResult)break;
mmResult = waveInAddBuffer(phwi, &pwh1, sizeof(WAVEHDR));
LOGXD("The buffer 1 Add audio input device ");
mmResult = waveInAddBuffer(phwi, &pwh2, sizeof(WAVEHDR));
LOGXD("The buffer 2 Add audio input device ");
if (MMSYSERR_NOERROR != mmResult)break;
mmResult = waveInStart(phwi);//6
LOGXA("Request to start recording");
getDealFun() = _fun;
g_sound = this;
while (getRunState()) { Sleep(1000); }
waveInReset(phwi);
waveInClose(phwi);
} while (false);
LOGXF("record was exit");
}
void Start::doSomething(){
int all_number = 20;
int now_number =0;
fstream out_file;
auto del_fun = [&now_number, all_number, &out_file](HWAVEIN hwavein, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2,bool &is_run) {
LPWAVEHDR waveheader = ((LPWAVEHDR)dwParam1);
LOGXD("The buffer %d To fill ...", waveheader->dwUser);
LOGXD("The buffer %d To fill ...", waveheader->dwBytesRecorded);
if (now_number>=all_number) {
out_file.close();
out_file.open("C:/desktop/1/" + to_string(time(nullptr)) + ".pcm", ios::out | ios::binary);
now_number = 0;
}
now_number++;
out_file.write(waveheader->lpData, waveheader->dwBytesRecorded);
};
SoundRecord s;
s.getPcm(8000,1,16, del_fun);
}
pcm to mp3
ffmpeg -y -f s16be -ac 1 -ar 8000 -acodec pcm_s16le -i 1.pcm new.mp3