Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实时播放填充pcm值的数组_C#_Audio_Real Time_Pcm - Fatal编程技术网

C# 实时播放填充pcm值的数组

C# 实时播放填充pcm值的数组,c#,audio,real-time,pcm,C#,Audio,Real Time,Pcm,我需要能够播放一个简短的[]数组填充16位PCM值(解码后)在实时。 阵法越来越长,玩家应该能够在阵法“增长”时使用它 我用C#写了一篇文章 谢谢你, 奥菲克 编辑: 我使用了BufferedWaveProvider,代码如下所示: Class Player { Private WaveFormat waveForamt=new WaveFormat(8000,16,1); private BufferedWaveProvider bufferedWaveProvider;

我需要能够播放一个简短的[]数组填充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函数得到的数组有32000长,我可以看到参数 bufferedWaveProvider.BufferedBytes=32000 bufferedWaveProvider.BufferedBytes=80000 bufferedWaveProvider.BufferedDuration=00:00:02 bufferedWaveProvider.BufferDuration=00:00:05

当我录制阵列时,我说了2秒钟,然后说:“一,二,三…” 问题是当我演奏它时,我只听到一个快速的声音,和我说的完全不同

你知道哪里出了问题吗

塔纳克斯,奥菲克

编辑2: 现在我的代码如下所示,我从Capture类调用AddSamples函数。 每次调用waveout.Play()函数后,我都会清除缓冲区,等待它再次填满。一旦它又满了,我就玩它,等等。问题是,在我第二次播放缓冲器时,声音开始得很快,然后就变慢了。。。我听说了一些关于使用两个缓冲区的事情。。你知道这件事吗? 太多了!

下面是调用player.AddSamples的类

您基本上需要能够设置声卡驱动程序,从音频缓冲区读取数据,然后写入同一缓冲区。naudio中的BufferedWaveProvider类可能会有所帮助。看一看

编辑:在一个空的“表单”项目中,您的课程对我来说很好,播放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);
    }
}

你是在后台线程中调用它,还是在控制台应用程序中调用它?这可能是线程或回调问题-请参阅中的WaveOut部分。您可能需要将不同的回调选项传递到WaveOut()?

您基本上需要能够设置声卡驱动程序从音频缓冲区读取,然后写入同一缓冲区。naudio中的BufferedWaveProvider类可能会有所帮助。看一看

编辑:在一个空的“表单”项目中,您的课程对我来说很好,播放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);
    }
}


你是在后台线程中调用它,还是在控制台应用程序中调用它?这可能是线程或回调问题-请参阅中的WaveOut部分。您可能需要将不同的回调选项传递到WaveOut()?

Dot Dot Multipot的可能重复项。改为改进你原来的问题。有关详细信息,请参阅。这不是同一个问题-这是关于实时播放的。好的,我会知道下次屏幕的照片?我觉得你把“截屏”看得太字面了。可能是“不要多头”的复制品。改为改进你原来的问题。有关详细信息,请参阅。这不是同一个问题-这是关于实时播放的。好的,我会知道下次屏幕的照片?我觉得你把“屏幕截图”看得太字面了。谢谢你的回答。现在它对我起作用了,我将callback函数添加到WaveOut构造函数中。但是如果你能帮我,我还有一个问题。。。请再次查看我更新的问题:)问题:为什么您的玩家类在AddSamples()中使用WaveOut做任何事情?你不应该只是在那里添加示例吗?还有,这是一个控制台应用程序吗?最后-屏幕截图不那么友好,因为它们无法复制/粘贴或搜索:)太好了。祝您在项目的其余部分好运!:)谢谢你的回答。现在它对我起作用了,我将callback函数添加到WaveOut构造函数中。但是如果你能帮我,我还有一个问题。。。请再次查看我更新的问题:)问题:为什么您的玩家类在AddSamples()中使用WaveOut做任何事情?你不应该只是在那里添加示例吗?还有,这是一个控制台应用程序吗?最后-屏幕截图不那么友好,因为它们无法复制/粘贴或搜索:)太好了。祝您在项目的其余部分好运!:)