如何知道Naudio C#中的音频是否已经死机

时间:2014-08-08 13:34:09

标签: c# naudio

我试图找出这首歌何时死亡(听不见的声音几秒钟)。我在C#中使用Naudio库。直到现在我能够获得PCM数据并绘制音频的幅度。我正在通过我获得的振幅猜测死音频。但我对音频频道有点困惑。以下是我写的代码。

        NAudio.Wave.WaveChannel32 wave = new NAudio.Wave.WaveChannel32(new NAudio.Wave.WaveFileReader(open.FileName));

        int songLength = (int)wave.Length;
        byte[] songPCM = new byte[songLength];

        int sampleRate = (int)wave.WaveFormat.SampleRate;
        int bitsPerSample = (int)wave.WaveFormat.BitsPerSample;
        int numChannels = (int)wave.WaveFormat.Channels;

        wave.Read(songPCM, 0, songLength);


        double[] _waveLeft = new double[songLength / 8];
        double[] _waveRight = new double[songLength / 8];


        System.IO.StreamWriter fileoutLeft = new System.IO.StreamWriter("E:\\LOutputSongPCM.dat", true);
        System.IO.StreamWriter fileoutRight = new System.IO.StreamWriter("E:\\ROutputSongPCM.dat", true);


            int h = 0;
            for (int i = 0; i < songLength; i += 8)
            {

                _waveLeft[h] = (double)BitConverter.ToSingle(songPCM, i);
                _waveRight[h] = (double)BitConverter.ToSingle(songPCM, i + 4);

                chart1.Series["wave"].Points.Add(_waveLeft[h]);
                //chart1.Series["wave"].Points.Add(_waveRight[h]);

                fileoutLeft.WriteLine(_waveLeft[h]);
                fileoutRight.WriteLine(_waveRight[h]);
                h++;
            }

            fileoutLeft.Close();
            fileoutRight.Close();

现在对于这段代码我知道音频是2通道。所以我提到了许多链接和线程,如果我正确地读取每个通道的pcm数据,我会感到困惑。然而,我比较了每个频道的情节,它们看起来不错(与原创歌曲相匹配),但我不确定它们的准确性。你能指导我获得任何频道的确切原始数据吗?单声道,立体声和5.1。

感谢。

1 个答案:

答案 0 :(得分:0)

通过使用AudioFileReader类,其Read方法采用float数组,您可以更轻松地获取样本。交错存储样本用于多声道音频,因此对于立体声,您将获得左侧样本,然后是右侧样本,然后是另一个左侧,依此类推。