【问题标题】:How to get sound data sample value in c#如何在c#中获取声音数据样本值
【发布时间】:2012-05-07 06:33:15
【问题描述】:

我需要获取 WAV 文件的声音数据的样本值,以便通过使用这些样本值,我需要每秒获取该声音数据的幅度值。

重要提示:有没有办法使用Naudio库或wmp库获取音频数据样本值?

我以这种方式获取样本值:

byte[] data = File.ReadAllBytes(File_textBox.Text);
            var samples=new int[data.Length];
            int x = 0;
            for (int i = 44; i <data.Length; i += 2)
            {
                samples[x] = BitConverter.ToInt16(data, i);
                x++;
            }

但我得到的负值更像 (-326260)。这是对还是错? 我的意思是一个样本值可以是负数还是负数,如果它是正确的,那么它意味着声音或静音是什么意思?

【问题讨论】:

    标签: c# audio sampling bitconverter


    【解决方案1】:

    NAudio 可以为您做到这一点,它在库中(我认为它是 WaveStream 或 WaveReader 类,或类似的东西)。如果开销不是太大,我可以推荐它。

    如果您想自己滚动并处理任意波形文件,则必须阅读 WAV 文件格式,并自己分析文件头。

    虽然一般 WAV 文件包含 16 位样本,但并非必须如此,并且根据确切的格式,它们可能以小端或大端存储。

    标头包含有关采样率、通道数、每个样本的位数、每个样本的字节数等信息,您可以通过这些信息进行实际数学运算以获取一个样本。

    【讨论】:

    • 我研究过WAV文件格式,知道第44个字节之后有声音数据。但我需要知道的是,如果我得到样本的负值,它们意味着什么是静音?因为我得到了很多负样本值,但我的 WAV 文件中有一个非凡的声音
    • 负值是意料之中的。您正在阅读短裤,因此具有负值是完全正常的。 16 位样本存储为有符号值。零表示没有声音。另请注意,您的示例数组是整数(这应该不是问题),并且它的大小比必要的长((data.Length - 44) / 2 就足够了)。
    • 不,我不是在看短裤。从代码可以看出,我只是将字节转换为 INT16。但我得到了负值。它发生在样本数组中,假设索引 1 上的值为 -32465,索引 2 上的值为 32465。所以我很困惑这是什么......哪个是声音,哪个是静音或哪个哪个是响亮的声音,哪个是较慢的声音。
    • 呃……短是 Int16。您正在以两个为一组循环遍历数组(这就是我所说的“读取”)。 BitConverter.ToInt16() 将返回一个 Int16,是一个短整数,是一个 16 位有符号整数。假设它是一个 16 位 WAV 文件,这将起作用。如果没有关于 WAV 文件的更多信息(通道数、每个样本的字节数等),就无法提供更多信息。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多