c# - 如何找出字节的格式?南音频

标签 c# audio naudio

我正在尝试做的事情:从麦克风接收数据(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);
    }

最佳答案

您正在接收 WaveIn.WaveFormat 中指定格式的音频.您的评论显示每个样本 16 位,这意味着您接收的音频是带符号的 16 位样本。所以你可以使用 BitConverter.ToInt16
但是有更简单的方法可以做到这一点。如果您调用ToSampleProvider()在您的 BufferedWaveProvider 上然后您可以将其传递给 VolumeSampleProvider这将让您直接调整音量,而无需自己打开样本。

关于c# - 如何找出字节的格式?南音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60230969/

相关文章:

c# - 检测控件是否被处置

c# - 在 session 中存储登录名和密码哈希是否安全?

audio - 如何使用 ffmpeg 将音频流重定向到虚拟脉冲音频麦克风?

ios - EZMicrophone EXC_BAD_ACCESS

c# - 从 C# 将数据传入和传出 DLL

c# - LINQ 连接两个字符串数组中的元素

android - Android Nexus Lollipop Mediaplayer正在不断寻求媒体播放

c# - 加载到内存中的音频文件在播放前有 500 毫秒的延迟

c# - 如何分别播放音频文件的每个 channel ?

audio - NAudio Mp3解码滴答声并弹出