如何找出字节的格式?北美音频

Posted

技术标签:

【中文标题】如何找出字节的格式?北美音频【英文标题】:How to find out the format of bytes? NAudio 【发布时间】:2020-02-14 17:27:22 【问题描述】:

我要做的是:从麦克风接收数据 (IWaveIn) => 降低声音的幅度(降低音量)(问题)=> 将其播放到扬声器(IWaveProvider)

问题是:每当我尝试将样本乘以 x!=1.0f 时,都会给我带来非常嘈杂的反馈。 我认为它可能是一种字节格式,但我不知道如何检查它。任何帮助/建议将不胜感激。

计数 = 17640;偏移量=0;

public int Read(byte[] buffer, int offset, int count)
    
        int read = bufferedWaveProvider.Read(buffer, offset, count);

        /*
                waveIn.WaveFormat.Channels; //2
                waveIn.WaveFormat.BlockAlign;//4
                waveIn.WaveFormat.BitsPerSample;//16
                waveIn.WaveFormat.SampleRate;//44100
         */

        for (int i = 0; i < read / 4; i++)
        
            int firstByte = i * 4;
            float sample = BitConverter.ToSingle(buffer, firstByte);
            sample = sample * 1.0f;

            byte[] bytes = BitConverter.GetBytes(sample);
            buffer[firstByte + 0] = bytes[0];
            buffer[firstByte + 1] = bytes[1];
            buffer[firstByte + 2] = bytes[2];
            buffer[firstByte + 3] = bytes[3];
        

        return read;
    
    private void OnDataAvailable(object sender, WaveInEventArgs e)
    
        bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
    

【问题讨论】:

【参考方案1】:

您正在接收WaveIn.WaveFormat 中指定格式的音频。您的评论显示每个样本 16 位,这意味着您接收的音频是带符号的 16 位样本。所以你可以使用BitConverter.ToInt16

但是有更简单的方法可以做到这一点。如果您在BufferedWaveProvider 上调用ToSampleProvider(),那么您可以将其传递给VolumeSampleProvider,这样您就可以直接调整音量,而无需自己解压样本。

【讨论】:

我知道有使用 ToSampleProvider() 的方法,但我计划添加一些其他效果(不仅仅是音量)。感谢您的回答,情况就是这样。如果waveformat.bitspersample != 16,假设32bits/sample可以转换为int32或float怎么办?是否有任何表格显示哪些波形可以转换为哪种数据类型?再次感谢您在这种特定情况下的帮助。 ToSampleProvider 处理最常见的格式 - 16bit、24bit、32bit int、32bit float

以上是关于如何找出字节的格式?北美音频的主要内容,如果未能解决你的问题,请参考以下文章

有人买过北美枫情地板吗?

Hive x UniCareer | 北美职场咨询,Offer任性挑

北美全栈开发必读:深入解读MongoDB

北美IT求职攻略

在职博士DBA | 北美宾夕法尼亚商学院

2019北美KubeCon+CloudNativeCon上的K8S五大趋势