0

My task is to decode a mp3 file, exclude its header, side information and the optional checksum. I just need the actual data of every frame of the mp3 file. I have googled a lot but did't find a way ! Can any one tell me a direct way to do that. I am using NAudio to access frames using ReadNextFrame() Any help will be appreciated.

4

3 回答 3

1

http://mark-dot-net.blogspot.de/2010/11/merging-mp3-files-with-naudio-in-c-and.html中所述,您可以将代码更改为:

    public static byte[] GetRawMp3Frames(string filename)
    {
        using(MemoryStream output = new MemoryStream()) {
            Mp3FileReader reader = new Mp3FileReader(filename);
            Mp3Frame frame;
            while ((frame = reader.ReadNextFrame()) != null)
            {
                output.Write(frame.RawData, 0, frame.RawData.Length);
            }
            return output.ToArray(); 
        }
   }

然后,您可以通过执行以下操作来处理仅帧字节:

var btAllFrames = GetRawMp3Frames("MyMp3.mp3");
于 2013-09-17T07:44:28.353 回答
0

编辑:看起来这是一个欺骗问题,在这里得到了更好的回答。

原创:听起来你想要一个完整的 MP3 解码器,输出 main_data 块而不是解码它们。

两种选择:

  1. 构建您自己的阅读器(完成第三层的位储层计算),或
  2. 从现有解码器中删除音频解码逻辑并插入您的输出逻辑。

您可能可以应用一些技巧,这些技巧可以让您至少对某些标题/侧面信息进行短路解码,但这需要对规范有透彻的了解。

如果您需要从选项 #2 开始,请尝试搜索 NLayer、JLayer、libmad 或“dist10 源”。

于 2013-09-18T19:40:39.787 回答
0

显然 NAudio 使用NLayer

这对我有用

  byte[] data = File.ReadAllBytes("path/to/file.mp3");
  var memStream = new System.IO.MemoryStream(results);
  var mpgFile = new NLayer.MpegFile(memStream);
  var samples = new float[mpgFile.Length];
  mpgFile.ReadSamples(samples, 0, (int)mpgFile.Length);
于 2020-06-18T12:42:00.050 回答