如何使用NAudio解码c#中的mp3文件

时间:2013-09-17 05:46:04

标签: c# mp3 audio-streaming naudio decoding

我的任务是解码mp3文件,排除其标题,辅助信息和可选的校验和。我只需要mp3文件每一帧的实际数据。 我google了很多但没找到方法! 任何人都能告诉我一个直接的方法。我正在使用NAudio使用ReadNextFrame()访问帧 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

编辑:看起来这是一个更好的回答问题here

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

两个选项:

  1. 构建您自己的读者(完成第三层的位库计算)或
  2. 从现有解码器中删除音频解码逻辑,然后插入输出逻辑。
  3. 您可以应用一些技巧,这些技巧可以让您至少对某些标题/边信息进行短路解码,但这需要彻底了解规范。

    如果您需要选择#2选项,请尝试搜索NLayer,JLayer,libmad或“dist10 source”。

答案 2 :(得分: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);