.Net如何直接播放音频样本

时间:2012-12-19 18:43:58

标签: c# .net audio naudio

我有通过NAudio提取的音频样本,我知道参数:

  • 频道
  • 每个样本
  • 个字节,
  • 采样率

如何使用.Net api /或其他.Net库

播放该样本

这里代码:

    openFileDialog1.ShowDialog();
    using (var reader = new Mp3FileReader(openFileDialog1.FileName))
    {
        var pcmLength = (int)reader.Length;
        var _leftBuffer = new byte[pcmLength / 2];
        var buffer = new byte[pcmLength];
        var bytesRead = reader.Read(buffer, 0, pcmLength);
        int index = 0;
        for (int i = 0; i < bytesRead; i += 4)
        {
           //extracting only left channel 
           _leftBuffer[index] = buffer[i];
           index++;
           _leftBuffer[index] = buffer[i + 1];
           index++;
         }

         // How to play  _leftBuffer (Single channel, 2 bytes per sample, 44100 samples per secound)
}

2 个答案:

答案 0 :(得分:2)

首先,您需要实现IWaveProvider或用户之一的IWaveProvider实施,例如WaveProvider16。接下来,使用WaveOut使用IWaveProvider初始化WaveOut.Init(IWaveProvider Provider)对象,最后致电WaveOut.Play()

答案 1 :(得分:1)

是的,我找到了一个解决方案:A low-level audio player in C#

完整的代码:

public partial class Form1 : Form
    {
        private byte[] _leftBuffer;
        private BiQuadFilter _leftFilter;
        private BiQuadFilter _rightFilter;
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            using (var reader = new Mp3FileReader(openFileDialog1.FileName))
            {
                var pcmLength = (int)reader.Length;
                _leftBuffer = new byte[pcmLength / 2];
                var buffer = new byte[pcmLength];
                var bytesRead = reader.Read(buffer, 0, pcmLength);

                int index = 0;
                for (int i = 0; i < bytesRead; i += 4)
                {
                    _leftBuffer[index] = buffer[i];
                    index++;
                    _leftBuffer[index] = buffer[i + 1];
                    index++;
                }
                var player = new WaveLib.WaveOutPlayer(-1, new WaveLib.WaveFormat(44100, 16, 1), _leftBuffer.Length, 1, (data, size) =>
                                                                                                               {
                                                                                                                   byte[] b = _leftBuffer;
                                                                                                                   System.Runtime.InteropServices.Marshal.Copy(b, 0, data, size);
                                                                                                               });
            }
        }
    }