我开发了一个系统,其中 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
已更新。
我感谢您的帮助。