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

解决方案 »

  1.   

    假设每个包里有三个sample:包1:左1 左2 左3;包2:右1 右2 右3
    合并写入一个文件时,应该写为包1: 左1 右1 左2 右2 左3 右3
    你这样写入试试看,因为两声道的数据格式应该就是“左右”。
      

  2.   

    按楼上所说,似乎还得先看每个数据包有几个sample?但是我在http://www.cnblogs.com/liyiwen/archive/2010/04/19/1715715.html这里看到16位双声道那个图,和你的图示不一样啊
      

  3.   

    那个图里的每个sample已经包含了两个声道的数据了,因为你的BitsPerSample是2个字节,BlockAlign在2声道情况下是4字节对齐,因此每4个字节包含了1个sample的左右声道数据。
    举例图中的24 17 1e f3,24 17对应左声道,1e f3对应右声道,两个合在一起构成了sample2,依次类推下去。
      

  4.   

    那如果我当时分成两个文件存储的话,当时参数设置如下:
    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 就可以了吧?
      

  5.   

    是的,只需要更改声道数即可。关键在于处理sample的对齐,可以先尝试下。