根据格式信息对波形文件列表进行排序

Posted

技术标签:

【中文标题】根据格式信息对波形文件列表进行排序【英文标题】:Sort list of wave files based on format info 【发布时间】:2014-06-11 15:43:47 【问题描述】:

我有一大堆 .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);
      
    

【问题讨论】:

【参考方案1】:

请记住,数组成员(包括 byte[])会自动初始化为数组类型的默认初始值。 Byte[] 数组初始化为 0x0。没有真正看到发生了什么:

ByteArrFromFileStream(...)

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

附带说明,在使用任何“流”类型时,请务必注意关闭流的人员和内容,为了进一步阅读,我建议仔细阅读这篇文章:http://msdn.microsoft.com/en-us/library/bb985010.aspx

【讨论】:

以上是关于根据格式信息对波形文件列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中根据文件类型对文件名进行排序

根据总值对对象数组列表进行排序

如何根据GPA对数组列表进行升序排序? arraylist 包含一个对象数组。 (Java)[重复]

列表中嵌套字典,根据字典的值排序

根据多个正则表达式子字符串对变量进行排序

如何根据另一个列表对元组列表进行排序