使用C#Media.SoundPlayer播放实时声音缓冲区

使用C#Media.SoundPlayer播放实时声音缓冲区,c#,buffer,voice,wave,soundplayer,C#,Buffer,Voice,Wave,Soundplayer,我开发了一个系统,其中一个C程序从另一个子系统接收声音缓冲区(字节数组)。它应该连续播放传入缓冲区。我在网上搜索,决定使用SoundPlayer。它在脱机模式下工作得非常好(在收到所有缓冲区后播放它们)。但是,我在实时模式中遇到了一个问题 在实时模式下,程序首先等待多个缓冲区阵列(例如200)接收并累积它们。然后它添加一个wav头并播放它。但是,在这之后,对于接下来的每200个阵列,它会重复播放第一个缓冲区 我读了以下几页: 根据他们的建议,我实现了如下代码: public class Me

我开发了一个系统,其中一个C程序从另一个子系统接收声音缓冲区(字节数组)。它应该连续播放传入缓冲区。我在网上搜索,决定使用
SoundPlayer
。它在脱机模式下工作得非常好(在收到所有缓冲区后播放它们)。但是,我在实时模式中遇到了一个问题

在实时模式下,程序首先等待多个缓冲区阵列(例如200)接收并累积它们。然后它添加一个wav头并播放它。但是,在这之后,对于接下来的每200个阵列,它会重复播放第一个缓冲区

我读了以下几页:

根据他们的建议,我实现了如下代码:

public class MediaPlayer
{
    System.Media.SoundPlayer soundPlayer;

    public MediaPlayer(byte[] buffer)
    {
        byte[] headerPlusBuffer = AddWaveHeader(buffer, false, 1, 16, 8000, buffer.Length / 2); //add wav header to the **first** buffer
        MemoryStream memoryStream = new MemoryStream(headerPlusBuffer, true);
        soundPlayer = new System.Media.SoundPlayer(memoryStream);
    }

    public void Play()
    {
        soundPlayer.PlaySync();
    }

    public void Play(byte[] buffer)
    {
        soundPlayer.Stream.Seek(0, SeekOrigin.Begin);
        soundPlayer.Stream.Write(buffer, 0, buffer.Length);
        soundPlayer.PlaySync();
    }
}
我是这样使用它的:

MediaPlayer _mediaPlayer;
if (firstBuffer)
{
    _mediaPlayer = new MediaPlayer(dataRaw);
    _mediaPlayer.Play();
}
else
{
    _mediaPlayer.Play(dataRaw);
}
每次调用
\u mediaPlayer.Play(dataRaw)
时,第一个缓冲区会一次又一次地播放;不过,
dataRaw
已更新


非常感谢您的帮助。

如果您的API不是为流式播放而设计的,那么在包装器中添加流式播放是没有好方法的。传递一系列块不会在块之间达到正确的时间。你需要一个为流媒体设计的API。谢谢你,本。那么你推荐什么样的流式播放API呢?我使用的是媒体基金会,但这对你的需求来说太复杂了。你能用图书馆吗?试试nAudio,你需要
BufferedWaveProvider
WaveOut
类。当你有一个不是为流播放设计的API时,没有好的方法在包装器中添加流。传递一系列块不会在块之间达到正确的时间。你需要一个为流媒体设计的API。谢谢你,本。那么你推荐什么样的流式播放API呢?我使用的是媒体基金会,但这对你的需求来说太复杂了。你能用图书馆吗?尝试nAudio,您将需要
BufferedWaveProvider
WaveOut
类。