我试图找出这首歌何时死亡(听不见的声音几秒钟)。我在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。
感谢。
答案 0 :(得分:0)
通过使用AudioFileReader
类,其Read
方法采用float数组,您可以更轻松地获取样本。交错存储样本用于多声道音频,因此对于立体声,您将获得左侧样本,然后是右侧样本,然后是另一个左侧,依此类推。