/// <summary> /// 服务启动调用 /// </summary> public void Init() { //以下初始化音频采集 for (int i = 0; i < MAXRECBUFFER; i++) { var hdr = new PcmAudio.WaveHdr { lpData = Marshal.AllocHGlobal(RECBUFFER), dwBufferLength = (UInt32)RECBUFFER }; globalhdr[i] = hdr; } lpFormat.wFormatTag = 1; //声音格式为PCM lpFormat.nChannels = 1; //采样声道数,对于单声道音频设置为1,立体声设置为2 lpFormat.wBitsPerSample = 16; //采样比特 16bits/次 lpFormat.cbSize = 0; //一般为0 lpFormat.nSamplesPerSec = 8000; //采样率 8000 次/秒 lpFormat.nBlockAlign = 2; //一个块的大小,采样bit的字节数乘以声道数 lpFormat.nAvgBytesPerSec = 16000; //每秒的数据率,就是每秒能采集多少字节的数据 ////初始化音频格式结构体 //lpFormatPlay.wFormatTag = 1;//声音格式为PCM //lpFormatPlay.nChannels = 1; //lpFormatPlay.wBitsPerSample = 16; //lpFormatPlay.cbSize = 0; //lpFormatPlay.nSamplesPerSec = 8000; //lpFormatPlay.nAvgBytesPerSec = 16000; //lpFormatPlay.nBlockAlign = 2; }
/// <summary> /// 喊话处理 /// </summary> /// <param name="hdr"></param> private void OnSoundData(PcmAudio.WaveHdr hdr) { if (!IsRecoding) { return; } if (hdr.dwBytesRecorded == 0) { return; } //使采集过程,直到此buffer已经沾满,不能再填充 PcmAudio.waveInUnprepareHeader(hRecord, ref hdr, (UInt32)Marshal.SizeOf(typeof(PcmAudio.WaveHdr))); //将采集到的声音发送给播放线程 if (hdr.lpData != IntPtr.Zero) { DataProc(hdr.dwBytesRecorded, hdr.lpData); } }