record sound

获取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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
录音程序,可在DEC++或vc++6.0编译环境下成功运行 部分代码: int main() { creat_file(); //新建文件,原文件数据被删除 RecordWave(); //录音函数 simplest_pcm16le_to_wave("NocturneNo2inEflat_44.1k_s16le.pcm", 1, 44100, "output_nocture.wav"); //将二进制录音信息从内存中提取,并生成 wav 文件 测控 1602 DEV C ++ 环境下 控制台应用程序 善解人意 成员:王帅、赵永玻、侯雅茹 3 return 0; } void RecordWave() { int count = waveInGetNumDevs(); //检测录音设备 printf("\n 音频输入数量:%d\n", count); WAVEINCAPS waveIncaps; MMRESULT mmResult = waveInGetDevCaps(0, &waveIncaps;, sizeof(WAVEINCAPS)); printf("\n 音频输入设备:%s\n", waveIncaps.szPname); if (MMSYSERR_NOERROR == mmResult) { //HWAVEIN phwi; WAVEFORMATEX pwfx; //录音格式指针 WaveInitFormat (&pwfx;, //波形声音的格式,单声道双声道使用 WAVE_FORMAT_PCM.当包含在 WAVEFORMATEXTENSIBLE 结构中时,使用 WAVE_FORMAT_EXTENSIBLE 1, //声道数量 44100, //采样率 16 // 采样位数 ); printf("\n 正在打开音频输入设备"); printf("\n 采样参数:声道 44.1kHz 16bit\n"); mmResult = waveInOpen( &phwi;, WAVE_MAPPER, &pwfx;, (DWORD)(MicCallback), NULL, CALLBACK_FUNCTION );//3 if (MMSYSERR_NOERROR == mmResult) { //WAVEHDR pwh1; char buffer1[10240]; pwh1.lpData = buffer1; pwh1.dwBufferLength = 10240; pwh1.dwUser = 1; pwh1.dwFlags = 0; 测控 1602 DEV C ++ 环境下 控制台应用程序 善解人意 成员:王帅、赵永玻、侯雅茹 4 mmResult = waveInPrepareHeader(phwi, &pwh1;, sizeof(WAVEHDR));//为波形输 入设备准备缓冲区 printf("\n 准备缓冲区 1"); //WAVEHDR pwh2; char buffer2[10240]; pwh2.lpData = buffer2; pwh2.dwBufferLength = 10240; pwh2.dwUser = 2; pwh2.dwFlags = 0; mmResult = waveInPrepareHeader(phwi, &pwh2;, sizeof(WAVEHDR));//为波形输 入设备准备缓冲区 printf("\n 准备缓冲区 2\n"); // WAVEHDR pwh3; char buffer3[10240]; pwh3.lpData = buffer3; pwh3.dwBufferLength = 10240; pwh3.dwUser = 3; pwh3.dwFlags = 0; mmResult = waveInPrepareHeader(phwi, &pwh3;, sizeof(WAVEHDR));//为波形输 入设备准备缓冲区 printf("准备缓冲区 3\n"); if (MMSYSERR_NOERROR == mmResult) { mmResult = waveInAddBuffer(phwi, &pwh1;, sizeof(WAVEHDR));//给输入设 备增加一个缓存 printf("\n 将缓冲区 1 加入音频输入设备"); mmResult = waveInAddBuffer(phwi, &pwh2;, sizeof(WAVEHDR));//给输入设 备增加一个缓存 printf("\n 将缓冲区 2 加入音频输入设备\n"); mmResult = waveInAddBuffer(phwi, &pwh3;, sizeof(WAVEHDR));//给输入设 备增加一个缓存 printf("将缓冲区 3 加入音频输入设备\n");
`record` 函数是 MATLAB 中一个用于录制音频的函数。它可以将从麦克风或其他音频设备中捕捉到的声音录制下来,并存储为一个音频文件。 以下是 `record` 函数的一些示例用法: 1. 录制指定时长的音频: ```matlab duration = 5; % 录音时长为 5 秒 Fs = 44100; % 采样率为 44100 Hz recObj = audiorecorder(Fs, 16, 1); % 创建一个音频录制对象 disp('开始录音...'); recordblocking(recObj, duration); % 录制指定时长的音频 disp('录音结束.'); audio = getaudiodata(recObj); % 获取录制的音频数据 audiowrite('myaudio.wav', audio, Fs); % 将音频数据保存为 WAV 文件 ``` 这个例子中,我们指定了录音时长为 5 秒,采样率为 44100 Hz(即每秒采样 44100 次),创建了一个音频录制对象 `recObj`,并使用 `recordblocking` 函数录制了 5 秒的音频。最后,我们使用 `getaudiodata` 函数获取录制的音频数据,然后使用 `audiowrite` 函数将音频数据保存为 WAV 文件。 2. 实时录制并播放音频: ```matlab Fs = 44100; % 采样率为 44100 Hz recObj = audiorecorder(Fs, 16, 1); % 创建一个音频录制对象 disp('按下回车键开始录音...'); pause; % 等待用户按下回车键 disp('开始录音...'); record(recObj); % 开始录制音频 disp('正在录制,请说话...'); pause(5); % 录制 5 秒的音频 stop(recObj); % 停止录制音频 disp('录音结束.'); audio = getaudiodata(recObj); % 获取录制的音频数据 sound(audio, Fs); % 播放录制的音频 ``` 这个例子中,我们创建了一个音频录制对象 `recObj`,等待用户按下回车键开始录制音频,然后使用 `record` 函数开始录制音频。录制 5 秒后,我们使用 `stop` 函数停止录制音频,使用 `getaudiodata` 函数获取录制的音频数据,然后使用 `sound` 函数播放录制的音频。 希望这能回答您的问题!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值