无法使用 NAudio 获取音频的波形图像

Posted

技术标签:

【中文标题】无法使用 NAudio 获取音频的波形图像【英文标题】:Unable to get wave form image for audio using NAudio 【发布时间】:2013-10-09 07:34:25 【问题描述】:

无法使用此代码获取持续时间较短的音频流的波形图像。 我得到完全空白的图像。有没有办法为更短的持续时间的音频流获得正确的波形图像。我在这里使用 NAudio 的 AudioFileReader 函数。

        Bitmap bim = new Bitmap(1800,200);
        System.Drawing.Graphics g = Graphics.FromImage(bim);

        using (var reader = new AudioFileReader("D:\\Test-Songs\\DawnJay.mp3"))
        
            var samples = reader.Length / (reader.WaveFormat.Channels * reader.WaveFormat.BitsPerSample / 8);
            var f = 0.0f;
            var max = 0.0f;

            // waveform will be a maximum of 4000 pixels wide:
            var batch = (int)Math.Max(40, samples / 4000);
            var mid = 100;
            var yScale = 100;
            float[] buffer = new float[batch];
            int read;
            var xPos = 0;

            Pen pen = new Pen(Color.Red, 2.0f);
            g.Clear(Color.Black);

            while ((read = reader.Read(buffer, 0, batch)) == batch)
            
                for (int n = 0; n < read; n++)
                
                    max = Math.Max(Math.Abs(buffer[n]), max);
                                                      

                int X1 = xPos;
                int X2 = xPos;
                float Y1 = mid + (max * yScale);
                float Y2 = mid - (max * yScale);

                g.DrawLine(pen,X1, Y1, X2, Y2);

                max = 0;
                xPos++;
            

        

        bim.Save("D:\\Images\\waveform.png");

【问题讨论】:

我已经修改了 NAudio 的 Wpf 演示代码以生成波形图像。 【参考方案1】:

你的代码在这里:

var batch = (int)Math.Max(40, samples / 4000);

这表示您将接受每列至少 40 个样本。对于小文件,这可能意味着您的数据在输出位图中仅减少为少量数据列。如果您随后缩小该数据以适应屏幕上的显示区域,您的音频数据可能会消失。

尝试将每个块的最小样本数更改为较小的值,这应该让您有机会实际可视化小型音频文件。您可能应该进行完整的 Min-Max 计算,否则您对非常小的文件的绘图将看起来完全错误。

【讨论】:

嗨@Corey,正如你所说,通过减少40个样本值我得到了较小持续时间文件的图像。我还有一个疑问,是否有可能获得像声音云一样的图像? 不确定 SoundCloud 如何处理边缘情况,但看起来他们只是在为每列做一个简单的最大级别。我会写一些代码,稍后在这里为您发布。 我将完成这个项目。任何方式感谢您的宝贵时间。

以上是关于无法使用 NAudio 获取音频的波形图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 无法正确生成方波

无法播放用 naudio 录制的音频流

[C#] NAudio 各种常见使用方式 播放 录制 转码 音频可视化

使用 NAudio 发送正在播放的音频

用 NAudio 录制音频让我无法接受

NAudio WaveFileWriter 不会将文件大小写入波形文件