代码之家  ›  专栏  ›  技术社区  ›  Marko

如何用C#NAudio操作字节?

  •  0
  • Marko  · 技术社区  · 6 年前
    • 我目前能够:记录数据从音频输入,生成wav文件与该数据在磁盘上,播放wav从磁盘上。

    使用的代码:

        public WaveIn waveSource = null;
        public WaveFileWriter waveFile = null;
        public List<byte> soundBytesList = new List<byte>();
    
        private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveFile != null)
                for (int i = 0; i < e.BytesRecorded; ++i)
                    soundBytesList.Add(e.Buffer[i]);
                waveFile.Write(e.Buffer, 0, e.BytesRecorded);
                waveFile.Flush();
        }
    
        public void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
        {
            if (waveSource != null)
            {
                waveSource.Dispose();
                waveSource = null;
            }
            if (waveFile != null)
            {
                waveFile.Dispose();
                waveFile = null;
            }
        }
    
        private void RecordButton_MouseDown(object sender, EventArgs e)
        {
            waveSource = new WaveIn();
            waveSource.WaveFormat = new WaveFormat(44100, 1);
    
            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
            waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
    
            waveFile = new WaveFileWriter("test.wav", waveSource.WaveFormat);
    
            waveSource.StartRecording();
        }
    
        private void RecordButton_MouseUp(object sender, EventArgs e)
        {
            waveSource.StopRecording();
    
            byte[] soundBytesArrayWAV = soundBytesList.ToArray();          
            byte[] outB = ConvertWavToMp3(soundBytesArrayWAV );
            File.WriteAllBytes("test.mp3", outB);
        }
    
            public byte[] ConvertWavToMp3(byte[] wavFile)
            {
                using (var retMs = new MemoryStream())
                using (var ms = new MemoryStream(wavFile))
                using (var rdr = new WaveFileReader(ms))
                using (var wtr = new LameMP3FileWriter(retMs, rdr.WaveFormat, 128))
                {
                    rdr.CopyTo(wtr);
                    wtr.Flush();
                    return retMs.ToArray();
                }
            }
    

    问题是我在ConvertWavToMp3方法上得到一个错误,它说提供的字节数组( soundBytesArrayWAV )没有RIFF(特定于wav的标题)。我的猜测是我没有正确地获取所有的字节 soundBytesList ,因为如果我将所有字节加载到内存中(从磁盘写入wav),转换工作正常。 你能帮我一下吗?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Marko    6 年前

    根据@Jon Skeet建议更新的功能代码如下:

        public WaveIn waveSource = null;
        public WaveFileWriter waveFile = null;
        public MemoryStream memStream = null;
    
        private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveFile != null)
            {
                waveFile.Write(e.Buffer, 0, e.BytesRecorded);
                waveFile.Flush();
            }
        }
    
        public void waveSource_RecordingStopped(object sender, StoppedEventArgs e)
        {
            if (waveSource != null)
            {
                waveSource.Dispose();
                waveSource = null;
            }
            if (waveFile != null)
            {
                waveFile.Dispose();
                waveFile = null;
            }
        }
    
        private void RecordButton_MouseDown(object sender, EventArgs e)
        {
            waveSource = new WaveIn();
            waveSource.WaveFormat = new WaveFormat(44100, 1);
    
            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
            waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
    
            memStream = new MemoryStream();
            waveFile = new WaveFileWriter(memStream, waveSource.WaveFormat);
    
            waveSource.StartRecording();
        }
    
        private void RecordButton_MouseUp(object sender, EventArgs e)
        {
            waveSource.StopRecording();
    
            byte[] outB = memStream.ToArray();
            File.WriteAllBytes("test.mp3", outB);
        }