1 我接收一个连续的数据流,其中左右声道的数据包持续交替出现,同时该数据包大小一致
2 最开始我是将每次数据包按照接收到的当前总包数的奇偶性分别存储到两个wave文件当中,这样两个wave均能播放正确成功,伪代码如下:
Int32 _packNum=0;
OnReceiveDataPack(Byte[] data)
{
_packNum++;
if(_packNum%2==1)
{
//WriteDataIntoFile(fileA);
}
else
{
//WriteDataIntoFile(fileB);
}
} wave文件格式设置
WaveFormat format = new WaveFormat();
format.FormatTag = WaveFormatTag.Pcm;//设置音频类型
format.SamplesPerSecond = 8000;//采样率
format.BitsPerSample = 16;//采样位数
format.Channels = 1;//声道
format.BlockAlign = (short)(format.Channels * (format.BitsPerSample /);//单位采样点的字节数
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;
3 接着我又分析了下双声道下wave文件格式,将当前总包数的奇偶性判断去掉了而是直接写入到一个文件(因为我确定接收到的数据包是左右声道交替出现),仅仅把wave文件格式改成了:
format.FormatTag = WaveFormatTag.Pcm;//设置音频类型
format.SamplesPerSecond = 8000;//采样率
format.BitsPerSample = 16;//采样位数
//format.Channels = 1;//声道
format.Channels = 2; //<-------------------------其实也就变了这里而已
format.BlockAlign = (short)(format.Channels * (format.BitsPerSample /);//单位采样点的字节数
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;
可是这种写入显然是错误的,因为这种方法形成的文件播放出来的声音显然不对。 问题1:请问熟悉这方面的人来指点一下,到底我哪里理解错了?
问题2:难道还是得判断当前总包数的奇偶性,陆续将包里面的数据写入到文件里面去,每次写八个字节包数据到文件,每次写都是间隔8个字节,比如:第一次从数据包读8个字节写八个字节到位置0,第二次继续从数据包读八个字节写八个字节到位置0+8,第三次再继续从数据包读8个字节写八个字节到位置0+2*8
2 最开始我是将每次数据包按照接收到的当前总包数的奇偶性分别存储到两个wave文件当中,这样两个wave均能播放正确成功,伪代码如下:
Int32 _packNum=0;
OnReceiveDataPack(Byte[] data)
{
_packNum++;
if(_packNum%2==1)
{
//WriteDataIntoFile(fileA);
}
else
{
//WriteDataIntoFile(fileB);
}
} wave文件格式设置
WaveFormat format = new WaveFormat();
format.FormatTag = WaveFormatTag.Pcm;//设置音频类型
format.SamplesPerSecond = 8000;//采样率
format.BitsPerSample = 16;//采样位数
format.Channels = 1;//声道
format.BlockAlign = (short)(format.Channels * (format.BitsPerSample /);//单位采样点的字节数
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;
3 接着我又分析了下双声道下wave文件格式,将当前总包数的奇偶性判断去掉了而是直接写入到一个文件(因为我确定接收到的数据包是左右声道交替出现),仅仅把wave文件格式改成了:
format.FormatTag = WaveFormatTag.Pcm;//设置音频类型
format.SamplesPerSecond = 8000;//采样率
format.BitsPerSample = 16;//采样位数
//format.Channels = 1;//声道
format.Channels = 2; //<-------------------------其实也就变了这里而已
format.BlockAlign = (short)(format.Channels * (format.BitsPerSample /);//单位采样点的字节数
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;
可是这种写入显然是错误的,因为这种方法形成的文件播放出来的声音显然不对。 问题1:请问熟悉这方面的人来指点一下,到底我哪里理解错了?
问题2:难道还是得判断当前总包数的奇偶性,陆续将包里面的数据写入到文件里面去,每次写八个字节包数据到文件,每次写都是间隔8个字节,比如:第一次从数据包读8个字节写八个字节到位置0,第二次继续从数据包读八个字节写八个字节到位置0+8,第三次再继续从数据包读8个字节写八个字节到位置0+2*8
解决方案 »
- C#线程小问题速问
- 已获得一个对象句柄,欲对其内部继续操作
- c#中怎么样获取DataTable的删除、新增、修改的记录??
- 调试时如何从函数中跳出
- 关于类的一些问题
- 急求c#+access论坛源码(最好用vs2005,2003也行),用尽所有分都只有70分啦.各位高人帮一下忙吧.
- 在C#中如何实现考场安排的算法代码!急……在线等
- 在线编辑WORD,EXCEL等OFFICE文档控件的源代码
- 求救:C#单击toolstript弹出的窗体的显示问题
- 得到远程主机名中的问题
- 有个网站很奇怪,偶尔打不开,请各位把把脉,谢谢~有分
- winform运行出现:"clr:错误:80004005,程序将立即终止??"
合并写入一个文件时,应该写为包1: 左1 右1 左2 右2 左3 右3
你这样写入试试看,因为两声道的数据格式应该就是“左右”。
举例图中的24 17 1e f3,24 17对应左声道,1e f3对应右声道,两个合在一起构成了sample2,依次类推下去。
WaveFormat format = new WaveFormat();
format.FormatTag = WaveFormatTag.Pcm;//设置音频类型
format.SamplesPerSecond = 8000;//采样率
format.BitsPerSample = 16;//采样位数
format.Channels = 1;//声道
format.BlockAlign = (short)(format.Channels * (format.BitsPerSample / 8));//单位采样点的字节数
format.AverageBytesPerSecond = format.BlockAlign * format.SamplesPerSecond;
这样形成两个文件后都能正常听到播放,那是否现在我就将 format.Channels = 2 就可以了吧?