jimu8130 2011年05月28日
关于如何写入已知数据流形成双声道wave文件(c#和directx),其实和语言没太大关系
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
...全文
82 点赞 收藏 6
写回复
6 条回复

还没有回复,快来抢沙发~

发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告