我使用WasapiLoopbackCapture来捕获来自扬声器的声音,然后使用onDataAvailable将其发送到另一台设备,我尝试播放使用WaveOut类和BufferedWaveProvider发送的数据并只添加一个每次使用onDataAvailable从我的客户端发送数据的示例。我在发送声音方面遇到了问题。我设法得到的最有效的是:
不同步客户端和服务器的Wave格式,只是发送数据并将其添加到示例中。问题是,即使我检查了缓冲区存储的大小并且它有51秒,这也很严重。我甚至不得不增加最终溢出的缓冲区大小。
我尝试同步Wave格式,我只是获得点击,但缓冲区大小没有问题。我还尝试确保至少有一秒存储在缓冲区中,但效果没有。
如果有人能指出我正确的方向,那就太好了。
答案 0 :(得分:2)
未压缩的音频占用网络上批次的空间。在我的机器上,WasapiLoopbackCapture
对象以每秒44100个采样产生32位(IeeeFloat)立体声采样,总原始带宽约为2.7Mbit / sec。一旦考虑了TCP数据包开销等等,就会传输相当多的数据。
我建议的第一件事是你在流程的每一步插入一些分析代码,以了解你的瓶颈发生在哪里。数据从捕获设备到达的速度有多快?你的包有多大?为您的OnDataAvailable
事件处理程序提供服务需要多长时间?您每秒通过网络发送多少数据?数据到达客户端的速度有多快?找出其中的瓶颈,你可以更好地了解 瓶颈是什么。
尝试构建一个模拟服务器,该服务器以各种WaveFormat
s(通道,每个样本的比特和采样率)从波形文件中读取数据,并模拟通过网络将该数据发送到客户端。您可能会发现问题在较低带宽时消失。如果带宽是问题,压缩可能是解决方案。
如果你正在使用单线程模型,并且每个OnDataAvailable
事件的服务时间要长于记录频率(即:每秒OnDataAvailable
的预期呼叫数),那么&# 39;将成为一个数据丢失问题。多线程可以帮助解决这个问题 - 一个用于从音频系统获取数据,另一个用于处理和发送数据。但是你最终可能处于相同的位置:丢失数据,因为你没有足够快地处理它。当发生这种情况时,了解它很方便,因为它表明程序中存在问题。找出它发生的时间和地点 - 输入,处理或输出缓冲区溢出都有不同的潜在原因,需要不同的关注。