我需要能够实时播放填充了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()函数后 - 我清除缓冲区并等待它再次填满。一旦它再次充满我就播放它,依此类推。问题是,在第二次播放缓冲区时,声音开始很快,然后它慢下来......我听到了一些关于使用两个缓冲区的事情......你对此有何了解? 很多!
这是调用player.AddSamples的类
答案 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()?