我正在尝试通过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设置都遇到相同的问题。结果一样。
或者我该如何继续解决问题?
答案 0 :(得分:1)
我知道了。
new WaveFormat(48000, 32, 2)
创建PCM编码格式,而捕获实例的格式是Ieeefloat编码。
万一有人需要,请更换
new WaveFormat(48000, 32, 2)
使用
WaveFormat.CreateIeeeFloatWaveFormat(48000, 2)
解决了该问题。
要在WaveFormat here上阅读更多内容