首页 新闻 会员 周边

关于如何写入已知数据流形成单个双声道wave文件(c#和directx),其实和语言没太大关系

0
悬赏园豆:10 [已关闭问题] 关闭于 2011-05-29 17:08

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

From Ocean的主页 From Ocean | 菜鸟二级 | 园豆:220
提问于:2011-05-28 21:58
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册