我开发了一个系统,其中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);
}
每次调用_mediaPlayer.Play(dataRaw)
时,第一个缓冲区一次又一次地播放; dataRaw
已更新。
感谢您的帮助。