利用TCP服务器接收多客户端的音频数据,通过Naudio进行播放及音频处理(二)Naudio开源库

首先需要通过NuGet安装Naudio开源库

1.using NAudio.Wave;创建播放对象,缓冲区

//初始化播放对象
WaveOut waveOut = new WaveOut();
//设置参数 采样率/采样位数/通道
WaveFormat waveFormat = new WaveFormat(8000, 16, 1);
//初始化缓冲区
BufferedWaveProvider _bufferedWaveProvider = null;
/// 
/// 播放音频
/// 
public void PlaySound()
{
    //设置缓冲的waveformat
    _bufferedWaveProvider = new BufferedWaveProvider(waveFormat);
    //是否丢弃数据
    _bufferedWaveProvider.DiscardOnBufferOverflow = true;
    //播放缓冲区的数据
    waveOut.Init(_bufferedWaveProvider);
    //开始
    waveOut.Play();
}

2.在接收数据的线程里,将数据加入缓冲区

/// 
/// 接收数据
/// 
/// 
public static void RecMsg(object sokConnectionparn)
{
	//实例化Socket对象
	Socket sokClient = sokConnectionparn;
	//定义接收数组
	byte[] arrMsgRec = new byte[128];
	while (true)
    {
    	 try
         {
         	//接收客户端数据	
             int lengths = sokClient.Receive(arrMsgRec);
         }
         catch (SocketException ex)
         {
            //一方断开连接
            break;
         }
         if(lengths>0){
         	//将数据加入缓冲区
         	_bufferedWaveProvider.AddSamples(byteMSG, 0, byteMSG.Length);
         }
	}
}

3.using NAudio.Dsp; 利用傅里叶变换,时域转频域

//创建复数数组
Complex[] complices = new Complex[512];
//把采集的arrMsgRec byte数组转化为float放入复数数组的实数部分
for (int i = 0; i < complices.Length; i++)
{
    short sample = BitConverter.ToInt16(arrMsgRec, i * 2);
    complices[i].X = sample / 32768f;
    complices[i].Y = 0.0f;
}
//做fft 点数为512 2的9次方为512
FastFourierTransform.FFT(true, 9, complices);
//新建float数组
float[] FFToutput = new float[512];
for (int i = 0; i < FFToutput.Length; i++)
 {
 	//求模放入float数组
     FFToutput[i] = (float)Math.Sqrt(complices[i].X * complices[i].X + complices[i].Y * complices[i].Y);
 }

采样频率为8k,fft点数为512,8000/512=15.625
所以FFToutput 数组每一个数代表15.625Hz区间段的幅值
至于第一个点为什么会大很多,这个问题我也不太了解
获得的FFToutput 数组可以放入图表显示中去

4.using NAudio.Wave.SampleProviders; 利用SampleProviders发出特定频率的声音

//新建信号发生器的对象
SignalGenerator mySinus = new SignalGenerator(8000, 1);
//调频
mySinus.Frequency = 7500;
//调模式(包括方波,正弦波,扫频等)
mySinus.Type = SignalGeneratorType.Sin;
WaveOut _myWaveOut = new WaveOut();
//放入播放器中
_myWaveOut.Init(mySinus);
_myWaveOut.Play();

如需利用信号发生器的数据

//新建线程读取数据
Thread thr = new Thread(RecMsgs);
thr.IsBackground = true;
thr.Start();
private void RecMsgs()
{
	float[] sts = new float[4096];
     while (true)
     {
     	//读取数据,读取的为float类型
     	mySinus.Read(sts, 0, sts.Length);
     }
}

**

如有什么错误的地方,望各位提出改进意见,让博主能够更快提升自己,谢谢

**
利用TCP服务器接收多客户端的音频数据,通过Naudio进行播放及音频处理(二)Naudio开源库_第1张图片

你可能感兴趣的:(c#)