C# 基于格式信息的wave文件排序列表

C# 基于格式信息的wave文件排序列表,c#,windows,audio,wav,C#,Windows,Audio,Wav,我有一大堆.wav文件,这些文件将由一个程序根据提供给它的文件名列表连接起来。 这个程序不断地把清晰的音频文件变成垃圾。。在使用audacity进行调查后,我意识到这些文件都是在不同的设备上录制的,有的是单声道格式,有的是立体声格式,采样率不同等等 为了能够将这些文件转换为所需的通用采样率(全部采用立体声等),我需要在audacity中运行一些批处理转换。 为此,我需要将文件分成具有相同采样率和相同曲目数的组等。 我用c#编写了一个实用程序,可以扫描包含所有这些文件的文件夹,并给我一个逗号分隔的

我有一大堆.wav文件,这些文件将由一个程序根据提供给它的文件名列表连接起来。 这个程序不断地把清晰的音频文件变成垃圾。。在使用audacity进行调查后,我意识到这些文件都是在不同的设备上录制的,有的是单声道格式,有的是立体声格式,采样率不同等等

为了能够将这些文件转换为所需的通用采样率(全部采用立体声等),我需要在audacity中运行一些批处理转换。 为此,我需要将文件分成具有相同采样率和相同曲目数的组等。 我用c#编写了一个实用程序,可以扫描包含所有这些文件的文件夹,并给我一个逗号分隔的txt文件,其中包含文件名和格式信息。 我正在将文件流读入bytearray,但在解释格式信息时,我认为程序不知何故在每个格式信息的末尾添加了额外的0

出什么事了?感谢您的帮助。 相关代码如下-

using (System.IO.StreamWriter file = new System.IO.StreamWriter(@pathString))
{
    fileLine += "[Resource Name ], [File Size], [Format Chunk Size], [isPCM ? ], [Num of Channels], [Sample Rate], [(Sample Rate * BitsPerSample * Channels) / 8],[BitsPerSample * Channels) / 8], [Bits PerSample], [Data Size ]" + Environment.NewLine;
    file.WriteLine(fileLine);
    fileLine = "";
    for (i = 0; i < FileNames.Length; i++)
    {
      string fname = "";
      fname = FileNames[i];
      fileLine += "'" + fname + "',";
      Byte[] resBytesArr = ByteArrFromFileStream(FileNames[i]);
      if (resBytesArr.Length > 44)
      {
      // file size 
      fileLine += "," + resBytesArr[4] + resBytesArr[5] + resBytesArr[6] + resBytesArr[7] ;
      // fmt size 
      fileLine += "," + resBytesArr[16] + resBytesArr[17] + resBytesArr[18] + resBytesArr[19] ;
      // format ? 1 for PCM  
      fileLine += "," + resBytesArr[20] + resBytesArr[21];
      // num of channels
      fileLine += "," + resBytesArr[22] + resBytesArr[23] ;
      // sample rate
      fileLine += "," + resBytesArr[24] + resBytesArr[25] + resBytesArr[26] + resBytesArr[27] ;
      //(Sample Rate * BitsPerSample * Channels) / 8
      fileLine += "," + resBytesArr[28] + resBytesArr[29] + resBytesArr[30] + resBytesArr[31] ;
      //(BitsPerSample * Channels) / 8.1 - 8 bit mono2 - 8 bit stereo/16 bit mono4 - 16 bit stereo
      fileLine += "," + resBytesArr[32] + resBytesArr[33] ;
      //Bits per sample
      fileLine += "," + resBytesArr[34] + resBytesArr[35] ;
      // data size 
      fileLine += "," + resBytesArr[40] + resBytesArr[41] + resBytesArr[42] + resBytesArr[43] ;
      // end of info for one resource, move to next
      fileLine += Environment.NewLine;
      file.WriteLine(fileLine);
      fileLine = "";
      file.WriteLine(".....done." + Environment.NewLine);
      }
      else
      {
        file.WriteLine("Byte Array seems invalid for " + fname + Environment.NewLine);
      }
    }
}
使用(System.IO.StreamWriter file=new System.IO.StreamWriter(@pathString))
{
fileLine+=“[资源名称],[文件大小],[格式块大小],[isPCM?],[通道数],[采样率],(采样率*比特采样*通道)/8],[比特采样*通道)/8],[比特/采样],[数据大小]”+Environment.NewLine;
file.WriteLine(文件行);
fileLine=“”;
对于(i=0;i44)
{
//文件大小
fileLine+=”,“+resBytesArr[4]+resBytesArr[5]+resBytesArr[6]+resBytesArr[7];
//fmt尺寸
fileLine+=”,“+resBytesArr[16]+resBytesArr[17]+resBytesArr[18]+resBytesArr[19];
//PCM的格式?1
fileLine+=”,“+resBytesArr[20]+resBytesArr[21];
//频道数
fileLine+=”,“+resBytesArr[22]+resBytesArr[23];
//采样率
fileLine+=”,“+resBytesArr[24]+resBytesArr[25]+resBytesArr[26]+resBytesArr[27];
//(采样率*位采样*通道)/8
fileLine+=”,“+resBytesArr[28]+resBytesArr[29]+resBytesArr[30]+resBytesArr[31];
//(比特采样*通道)/8.1-8位单声道2-8位立体声/16位单声道4-16位立体声
fileLine+=”,“+resBytesArr[32]+resBytesArr[33];
//每采样位数
fileLine+=“,”+resBytesArr[34]+resBytesArr[35];
//数据大小
fileLine+=”,“+resBytesArr[40]+resBytesArr[41]+resBytesArr[42]+resBytesArr[43];
//一个资源的信息结束,移动到下一个
fileLine+=Environment.NewLine;
file.WriteLine(文件行);
fileLine=“”;
file.WriteLine(“……完成”+Environment.NewLine);
}
其他的
{
file.WriteLine(“字节数组似乎对“+fname+Environment.NewLine”无效);
}
}
}

请记住,数组成员(包括字节[])会自动初始化为数组类型的默认初始值。字节[]数组初始化为0x0。在没有真正了解情况的情况下:

ByteArrFromFileStream(...)
我不得不猜测,我的猜测是,在您的一些文件上,最初编码二进制流的实际应用程序创建了一个标准块大小的malloc()内存分配缓冲区。当流的实际编码完成时,流的长度比上次分配的内存少了几个字节。因此,当文件被写入磁盘时,一堆0x0被一起写入

作为旁注,在使用任何“流”类型时,请务必小心关闭流的人和内容,为了进一步阅读,我建议阅读本文: