首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NAudio峰值音量计

NAudio峰值音量计
EN

Stack Overflow用户
提问于 2013-01-16 11:10:51
回答 3查看 12.1K关注 0票数 3

我正在尝试用NAudio写一个峰值音量计。我的代码与http://channel9.msdn.com/coding4fun/articles/NET-Voice-Recorder非常相似,但是我的代码和链接的语音记录器项目都有一个问题。

当播放恒定频率和音量的声音时,音量计最初从一个合理的水平开始,但随后衰减到一个非常小的值。我不知道为什么会这样,因为NAudioDemo中的峰值音量计不能做到这一点。我试图在我的程序中复制来自NAudioDemo的代码,但是我找不到包含峰值音量计代码的代码文件。

有人可以指导我创建峰值音量计的替代解决方案,或者帮助我确定为什么我的解决方案(和链接中提供的解决方案)都不起作用吗?

代码语言:javascript
运行
复制
public MainWindow()
    {
        int waveInDevices = WaveIn.DeviceCount;
        for (int waveInDevice = 0; waveInDevice < waveInDevices; waveInDevice++)
        {
            WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
            Console.WriteLine("Device {0}: {1}, {2} channels",
                waveInDevice, deviceInfo.ProductName, deviceInfo.Channels);

            WaveIn waveIn = new WaveIn();
            waveIn.DeviceNumber = 0; //TODO: Let the user choose which device, this comes from the device numbers above
            waveIn.DataAvailable += waveIn_DataAvailable;
            int sampleRate = SAMPLE_RATE; // 8 kHz
            int channels = 1; // mono
            waveIn.WaveFormat = new WaveFormat(sampleRate, channels);
            waveIn.StartRecording();
        }
    }

    void waveIn_DataAvailable(object sender, WaveInEventArgs e)
    {
        for (int index = 0; index < e.BytesRecorded; index += 2)
        {
            short sample = (short)((e.Buffer[index + 1] << 8) |
                                    e.Buffer[index + 0]);
            float sample32 = sample / 32768f;
            ProcessSample(sample32);
        }           

    }

    void ProcessSample(float sample1)
    {
        samplenumber += 1;

        if (sample1 > maxval)
        {
            maxval = sample1;
        }

        if (sample1 < minval)
        {
            minval = sample1;
        }


        //Run updateView every few loops

        if (samplenumber > (double)SAMPLE_RATE / DISPLAY_UPDATE_RATE)
        {
            samplenumber = 0;
            updateView(); //needs to be fast!
        }
    }

    void updateView()
    {
        Console.WriteLine(maxval);
        Console.WriteLine(minval);
        progressBar1.Value = (maxval - minval)*50;

        maxval = 0;
        minval = 0;
    }
EN

Stack Overflow用户

回答已采纳

发布于 2013-01-16 17:27:42

在这篇文章中发生的所有事情是,它找到了小间隔(例如20ms)上的最大音频峰值,然后将其绘制在分贝尺度上。要找到峰值,请检查间隔中每个样本的值并选择最大值(这就是SampleAggregator类正在做的事情)。要转换成分贝,取最大值的对数10为底,再乘以10。0dB是最大的分贝,任何低于-96dB的分贝实际上都是静音。(实际上,回过头来看这篇文章,我甚至不认为我费心去转换成分贝,这可能是我应该做的)

票数 6
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14350790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档