代码之家  ›  专栏  ›  技术社区  ›  sainath sagar

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

  •  1
  • sainath sagar  · 技术社区  · 11 年前

    无法使用此代码获取持续时间较小的音频流的波形图像。 我得到了一张完全空白的照片。对于持续时间较小的音频流,是否有任何方法可以获得正确的波形图像。我在这里使用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");
    
    1 回复  |  直到 11 年前
        1
  •  2
  •   Corey    11 年前

    此处为您的代码:

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

    这表明你将接受 最低限度 每列40个样本。对于小文件,这可能意味着您的数据在输出位图中只会减少到少量的数据列。如果你把数据缩小到屏幕上的显示区域,你的音频数据可能会消失。

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