【问题标题】:how to decode mp3 file in c# using NAudio如何使用 NAudio 在 C# 中解码 mp3 文件
【发布时间】:2013-09-17 05:46:03
【问题描述】:

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

【问题讨论】:

  • ReadNextFrame() 出了什么问题?

标签: c# mp3 audio-streaming naudio decoding


【解决方案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");

【讨论】:

  • 我已经使用过这种方法,但它还包括标题和辅助信息我只需要没有标题和所有其他辅助信息等的实际数据......
  • 我不这么认为。帧应该只包含原始音频数据。标头信息存储在标头之前。你确定吗?
  • mp3 中的每一帧都有自己的标题。但我必须排除标题解码器从标题和边信息中获取信息,并且只解码帧的实际位。我想做这样的事情跨度>
【解决方案2】:

编辑:看起来这是一个愚蠢的问题,得到了更好的回答 here

原件: 听起来您想要一个完整的 MP3 解码器来输出 main_data 块而不是对其进行解码。

两种选择:

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

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

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

【讨论】:

    【解决方案3】:

    显然 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);
    

    【讨论】:

      猜你喜欢
      • 2011-01-30
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2018-11-25
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多