玩实时填充pcm值的数组

时间:2013-12-01 14:32:19

标签: c# audio real-time pcm

我需要能够实时播放填充了16位PCM值的短[]数组(解码后)。 阵列越来越长,玩家应该能够在阵列“增长”时播放它。

我是用C#写的。

提前谢谢, 地平线

修改 我使用了BufferedWaveProvider,代码如下:

Class Player
{
    Private WaveFormat waveForamt=new WaveFormat(8000,16,1);
    private BufferedWaveProvider bufferedWaveProvider;

    public Player()
    {
        bufferedWaveProvider=new BufferedWaveProvider(waveFormat);
    }

    public void AddSamples(byte[] array)
    {
        bufferedWaveProvider.AddSamples(array,0,array.length);
        WaveOut waveout=new WaveOut();
        waveout.Init(bufferedWaveProvider);
        waveout.Play();
    }
}

AddSamples func获取的数组是32000长我可以看到参数     bufferedWaveProvider.BufferedBytes = 32000     bufferedWaveProvider.BufferedBytes = 80000     bufferedWaveProvider.BufferedDuration = 00:00:02     bufferedWaveProvider.BufferDuration = 00:00:05

当我录制阵列时,我说了2秒钟说:“一,二,三......” 问题在于,当我演奏它时,我只是听到一个快速的声音,就像我说的那样......

关于出了什么问题的任何想法?

Thnaks,Ofek

编辑2: 现在我的代码看起来像这样,我从Capture类调用AddSamples函数。 每次调用waveout.Play()函数后 - 我清除缓冲区并等待它再次填满。一旦它再次充满我就播放它,依此类推。问题是,在第二次播放缓冲区时,声音开始很快,然后它慢下来......我听到了一些关于使用两个缓冲区的事情......你对此有何了解? 很多! enter image description here

这是调用player.AddSamples的类 enter image description here

1 个答案:

答案 0 :(得分:0)

您基本上需要能够设置声卡驱动程序以从音频缓冲区读取,然后写入相同的缓冲区。 naudio中的BufferedWaveProvider类可以提供帮助。看看http://naudio.codeplex.com/

编辑:在一个空的“表单”项目中,您的课程适合我,播放2秒的音频:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var player = new Player();

        var rand = new Random();
        var bytes = new byte[32000];
        rand.NextBytes(bytes);

        player.AddSamples(bytes);
    }
}

您是在后台线程中调用它,还是在控制台应用程序中调用它?它可能是线程或回调问题 - 请参阅http://naudio.codeplex.com/wikipage?title=Audio%20Output%20Driver%20Selection中的 1)WaveOut 部分。您可能需要将不同的回调选项传递给WaveOut()?