我有一大堆.wav文件,它们将由程序连接,基于提供给它的文件名列表。 程序不断将清晰易读的音频文件变成垃圾......在使用大胆调查后,我意识到这些文件全部记录在不同的设备上,有些是单声道格式,有些是立体声,有不同的采样率等。
为了能够将这些文件转换为所需的通用采样率 - 所有这些都是立体声等,我需要以大胆度运行一些批量转换。 为此我需要将文件分成具有相同采样率和相同轨道数的组等。 我在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);
}
}
}
答案 0 :(得分:0)
请记住,数组成员(包括byte [])会自动初始化为数组类型的默认初始值。 Byte []数组初始化为0x0。没有真正看到正在发生的事情:
ByteArrFromFileStream(...)
我不得不猜测,我的猜测是,在你的一些文件中,最初编码二进制流的实际应用程序创建了一个标准的块大小的malloc()内存分配缓冲区。当流的实际编码完成时,流的长度比最后一次内存分配短几个字节。因此,当文件写入磁盘时,会发出一堆0x0。
作为旁注,当使用任何“流”类型时,请务必注意关闭流的人和内容,为了进一步阅读,我建议仔细阅读本文:http://msdn.microsoft.com/en-us/library/bb985010.aspx