C#-通过套接字连接进行实时流音频

时间:2020-06-04 21:03:49

标签: c# sockets audio naudio cscore

我正在尝试通过tcp套接字连接将音频从一台计算机流向另一台计算机。

计算机1 --->开关--->计算机2

计算机1是发送方/客户端,计算机2是接收方/服务器播放音频。

我设法使其正常工作,但是收到了很多噪音。

CSCore:

这是我目前用于通过以下方式发送数据的代码:

CaptureInstance = new WasapiLoopbackCapture();
CaptureInstance.Initialize();
CaptureInstance.DataAvailable += (s, a) => onStart(s, a);
CaptureInstance.Start();

其中onStart只需使用BinaryWriter将字节写入套接字的流中即可:

writer.Write(a.Data, a.Offset, a.ByteCount);

这是我目前在接收计算机上用来播放音频的代码:

int size = 3840;
WriteableBufferingSource src = new WriteableBufferingSource(new CSCore.WaveFormat(48000, 32, 2)) { FillWithZeros = true };

WasapiOut soundOut = new WasapiOut();
soundOut.Initialize(src);
soundOut.Play();

while (true)
{
    byte[] bytes = reader.ReadBytes(size); // BinaryReader
    src.Write(bytes, 0, size);
}

NAudio:

经过进一步的搜索,反复试验,我设法使用NAudio拼凑出一个新的解决方案,该解决方案也遇到了同样的问题。噪音很大,声音很大。

客户端(发送者)在套接字连接时使用以下代码:

var capture = new WasapiLoopbackCapture();

capture.DataAvailable += (obj, args) =>
{
    stream.Write(args.Buffer, 0, args.BytesRecorded); // NetworkStream(socket)
    stream.Flush();
};

capture.StartRecording();

服务器(接收方)正在使用此

// ---------------------------- Init --------------------------------
provider = new BufferedWaveProvider(new WaveFormat(48000, 32, 2));

WaveOut o = new WaveOut();
o.Init(provider);
o.Play();
// --------------------------- Callback -------------------------------
socket = (Socket)ar.AsyncState;

int received = socket.EndReceive(ar);
byte[] dataBuffer = new byte[received];
Array.Copy(buffer, dataBuffer, received);

provider.AddSamples(dataBuffer, 0, received);

socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);

我尝试允许提供者在播放前缓冲5-10秒,以防万一这是一个缓冲问题,但是没有运气。

我检查了WaveFormat,两台PC上均为48k,32位2通道。无论如何,我还是玩这些值,失败了。

我尝试使用UdpClient,但是情况变得更糟。如有必要,我可以显示该代码。播放速度较慢,如果不是那么多,则噪音更大。我使用此link进行设置。

我在两个客户端/服务器上都运行了一个循环,显示了每个块的接收/发送字节,打印出第一个和最后一个字节,它们看起来很好,而且顺序良好,但是在调试我之前使用MemoryStream进行的设置时,内存流的长度有12个字节的差异(一个在客户端,写与发送到服务器相同的字节,另一个在服务器上,写接收到的字节),并且有些字节不可用。

在客户端上录制音频15秒钟,然后在那里播放就可以了。当发送到另一台计算机时,它变得嘈杂。

我认为问题出在我的套接字设置上,但是我不太确定,我用完了所有选项。

tl; dr;问题是: 是什么原因导致这种沉重的噪音?两种NAudio / CSCore设置都遇到相同的问题。结果一样。

或者我该如何继续解决问题?

1 个答案:

答案 0 :(得分:1)

我知道了。

new WaveFormat(48000, 32, 2)

创建PCM编码格式,而捕获实例的格式是Ieeefloat编码。

万一有人需要,请更换

new WaveFormat(48000, 32, 2)

使用

WaveFormat.CreateIeeeFloatWaveFormat(48000, 2)

解决了该问题。

要在WaveFormat here上阅读更多内容