保存在 wave 中的 NAudio 文件在文件中添加了填充

Posted

技术标签:

【中文标题】保存在 wave 中的 NAudio 文件在文件中添加了填充【英文标题】:NAudio file saved in wave prepends added padding to the file 【发布时间】:2021-04-09 23:02:29 【问题描述】:

我有这样的代码:

        mp3File = new Mp3FileReader("someMP3Files.mp3");
        WaveChannel32 inputStream = new WaveChannel32(mp3File);
        streamProcessor = new WaveStreamProcessor(inputStream);
        CreateWaveFile("test.wav", inputStream);

所以基本上它需要 mp3 并将其转换为一个名为 test 的波形文件。查看转换后的文件,我看到了这一点。

注意突出显示的区域为什么它给出了空白空间并且不完全按照原样复制?

有什么想法吗?

我的造浪方法:

    public static void CreateWaveFile(string filename, WaveStream stream)
    
        using (WaveFileWriter writer = new WaveFileWriter(filename, stream.WaveFormat))
        
            byte[] buffer = new byte[stream.Length];
            while (true)
            
                int bytesRead = stream.Read(buffer, 0, buffer.Length);
                if (bytesRead == 0)
                    break;
                writer.WriteData(buffer, 0, bytesRead);
            
        
    

澄清一下,填充实际上是在创建Mp3FileReader时添加的。

【问题讨论】:

它实际上是在实例化 mp3 文件时发生的。然后在那里添加填充。 manual.audacityteam.org/man/… @HansPassant 我没有明白你在参考中所指的内容。 顶部图像似乎是单个 t(单声道?)机架,而底部图像是(立体声?)一对轨道。这就是Audacity的表现吗?我想知道您是否需要向 NAudio 提供一些额外的配置来告诉它您想要的输出格式? @Neil 不两者都是立体声,我只是没有发布整个屏幕。 【参考方案1】:
MemoryStream mp3Buffered = new MemoryStream();
using (var responseStream = resp.GetResponseStream())

    byte[] buffer = new byte[65536];
    int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
    while (bytesRead > 0)
    
        mp3Buffered.Write(buffer, 0, bytesRead);
        bytesRead = responseStream.Read(buffer, 0, buffer.Length);
    


mp3Buffered.Position = 0;
using (var mp3Stream = new Mp3FileReader(mp3Buffered))
    
    WaveFileWriter.CreateWaveFile("file.wav", mp3Stream);

我不太清楚你问的那个问题是什么意思,但是我尽了最大努力并进行了研究,所以这就是我发现的。而且我还认为在转换这些文件时会自动添加填充。

注意:如果我在 cmets 中错了,请不要抨击我,稍后查看我的个人资料,你会明白为什么。 :)

【讨论】:

是的,我也这么认为。我会检查一下代码,看看在哪里。将您的答案标记为有用。我看到了美好的未来:) 这真的能解决问题吗?看起来您正在将整个文件读入内存流,然后调用相同的(一组)函数。 顺便说一句,这对您有帮助吗?我希望它做到了:) 另外,@Neil,我基本上就是这样做的,但是进入内存流然后调用同一组函数要灵活得多,因为我会采用这种方法.我测试了代码,它对我有用。 我不明白为什么它“更灵活”。这真的能解决问题吗?流通常是更好的解决方案,因为它们不会在大文件中占用大量内存。

以上是关于保存在 wave 中的 NAudio 文件在文件中添加了填充的主要内容,如果未能解决你的问题,请参考以下文章

C# NAudio:如何访问 SignalGenerator 提供的样本以将它们保存为 WAVE 格式?

C# 使用 NAudio 转换 wav 文件

PCM Wave 文件中的数据长度使用 MemoryStream 和 WaveFileWriter

使用 NAudio 获取音频的峰值

如何使用 NAudio 从 mp3 中获取音频样本数据

Wave 文件 - 处理特定的音频数据块