1

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

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

我已阅读以下页面:

从内存中播放 wav/mp3

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已更新。

我感谢您的帮助。

4

0 回答 0