Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-通过套接字连接的实时流媒体音频_C#_Sockets_Audio_Naudio_Cscore - Fatal编程技术网

C#-通过套接字连接的实时流媒体音频

C#-通过套接字连接的实时流媒体音频,c#,sockets,audio,naudio,cscore,C#,Sockets,Audio,Naudio,Cscore,我正在尝试通过tcp套接字连接单向地将音频从一台计算机传输到另一台计算机 计算机1--->开关--->计算机2 计算机1是发送方/客户端,计算机2是播放音频的接收方/服务器 我设法让它发挥了一些作用,但是收到了很多噪音 CSCore: 这是我目前用来发送数据的代码: CaptureInstance = new WasapiLoopbackCapture(); CaptureInstance.Initialize(); CaptureInstance.DataAvailable += (s, a)

我正在尝试通过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();
我试着让提供商在播放前缓冲5-10秒,以防万一这是缓冲问题,但运气不好

我检查了波形,在两台电脑上都是48k,32位2通道。不管怎样,我玩的是数值,失败了

我试着使用UdpClient,但效果更糟。如果需要的话,我可以显示代码。播放速度较慢,如果不是那样的话,噪音也更大。我用这个来设置它

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

在客户端上录制15秒的音频,然后在那里播放。当发送到另一台计算机时,声音会变得非常嘈杂

我想问题出在我的套接字设置上,但我不太确定,我已经没有选择了

问题是: 是什么引起了如此大的噪音?两个NAudio/CSCore设置似乎都遇到了相同的问题。相同的结果

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

我找到了答案

new WaveFormat(48000, 32, 2)
这将创建PCM编码的格式,而捕获实例的格式是Ieeefloat编码的

如果有人需要,请更换

new WaveFormat(48000, 32, 2)

修正了这个问题

有关WaveFormat的更多信息

new WaveFormat(48000, 32, 2)
WaveFormat.CreateIeeeFloatWaveFormat(48000, 2)