使用C#Media.SoundPlayer

时间:2017-01-20 16:50:15

标签: c# buffer voice wave soundplayer

我开发了一个系统,其中C#程序从另一个子系统接收声音缓冲区(字节数组)。它应该连续播放输入缓冲区。我在网上搜索,我决定使用SoundPlayer。它在离线模式下完美运行(在收到所有缓冲区后播放缓冲区)。但是,我在实时模式下遇到了问题。

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

我已阅读以下页面:

Play wav/mp3 from memory

https://social.msdn.microsoft.com/Forums/vstudio/en-US/8ac2847c-3e2f-458c-b8ff-533728e267e0/c-problems-with-mediasoundplayer?forum=netfxbcl

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

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);
}

每次调用_mediaPlayer.Play(dataRaw)时,第一个缓冲区一次又一次地播放; dataRaw已更新。

感谢您的帮助。

0 个答案:

没有答案