c# - 实时播放充满pcm值的数组

标签 c# audio real-time pcm

我需要能够实时播放填充有16位PCM值的short []数组(解码后)。
阵列不断变长,并且在阵列“增长”时玩家应该能够播放它。

我是用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函数获得的数组是32000长,我可以看到参数
bufferedWaveProvider.BufferedBytes = 32000
bufferedWaveProvider.BufferedBytes = 80000
bufferedWaveProvider.BufferedDuration = 00:00:02
bufferedWaveProvider.BufferDuration = 00:00:05

当我记录数组时,我说2秒钟,然后说:“一,二,三...”
问题在于,当我播放它时,我只是听到快速的声音,而没有听到我所说的话。

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

Theks,Ofek

编辑2:
现在我的代码看起来像这样,我从Capture类调用AddSamples函数。
每次调用waveout.Play()函数之后-我清除缓冲区并等待其再次填满。一旦弹满,我就弹奏,依此类推。问题是在第二次播放缓冲区时,声音开始很快,然后又变慢了。。。我听说过使用两个缓冲区的事..您对此一无所知吗?
非常感谢!

这是调用播放器的类。

最佳答案

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

编辑:在一个空的“forms”项目中,您的类(class)对我来说效果很好,播放了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()?

关于c# - 实时播放充满pcm值的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20313220/

相关文章:

c# - 如何使 ASP.NET Core Web API 操作异步执行?

Android:在本地保存录音?

html - html5音频进度条/tribbles的问题

c# - Microsoft StreamInsight 准备好迎接黄金时段了吗?

java - 当数据库更改时在 Android 和桌面 Java 上触发事件

c# - 从 .NET 客户端对 Axis2/JAX-WS Web 服务使用多态调用

c# - "ref int m_a"如何让包含m a的对象不被GC回收?

real-time - 在线与实时

c# - 文件被复制然后提示它不存在

python - 如何减少波形的点数?