当前位置: 首页 > 知识库问答 >
问题:

Web音频Api实时流式PCM ADPCM

唐星晖
2023-03-14

我有一个传递客户端PCM或ADPCM数据的服务器。

我最初决定使用PCM是因为我不想处理编码和解码。

我让PCM工作,但在每一个音频块之间,我听到毛刺。(有点像剪辑)

所以我想原因可能是延迟/高质量的音频和所有这些东西。

所以我决定使用ADPCM来减少数据量。我用JavaScript编写了一个adpcm到pcm解码器。这是个麻烦。我希望,由于数据计数减少了,也许这会阻止小故障(数据将赶上正在播放的内容)

但我错了。我还是有小毛病。

这甚至可以用TCP完成吗?还是一个失败的事业。我没有WebSockets上的UDP。

我需要实现缓冲算法吗?我不想这样做,因为它是实时音频,我只想处理它,以我可以的速度。

你们知道一个很好的链接来阅读实时音频通过网络。

我可以给出代码示例,但这是一个高级问题。

PS:我尝试使用标签,但我们得到了一个缓冲问题,我们无法控制它。我也没有从服务器获得任何流控制。它没有说音频启动或音频停止我们暂停。这是一个推送协议,我得到的只是ADPCM和PCM数据

共有1个答案

齐驰
2023-03-14

是的,你当然可以使用TCP。UDP经常用于电话应用程序中,因为较低的开销使一切都更快,而且对于这种应用程序来说,数据包被丢弃或以错误的顺序到达都无关紧要。但由于UDP不是一个选项,您可以使用TCP。

正如您所怀疑的,在我看来您的问题是缓冲区不足。或者您到服务器的连接不够快(或者至少持续地不够快),或者您没有以足够快的速率从编码器提供数据。如果您正在实时记录数据,并尝试实时回放,则可能会发生这种情况。

一种解决方案是在将数据发送到客户端之前先在服务器端缓冲数据。在延迟要求允许的范围内拥有尽可能大的缓冲区。对于网络无线电的用途,我通常选择30秒的缓冲区,因为延迟并不重要。出于您的目的,您可能需要至少64KB的缓冲区。这是TCP数据包中允许的最大大小。这个数据包会在过程中被分割,但这是可以的。

您还可以查看服务器是如何发送数据的。尝试禁用Nagle算法,这样服务器就不会在发送更多数据之前等待ACK。

 类似资料:
  • 问题内容: 我正在另一台PC上实现从MIC到Java服务器的实时流传输。但是我只听到白噪声。 我已经附上了客户端程序和服务器程序 并且服务器端没有问题。它与android客户端AudioRecord完美运行。 问题答案: 因此,我用正弦波(或某种在某种意义上类似正弦波的东西)填充了麦克风,并且您的程序运行正常。 因此,我的具体更改是: 显然,我将其误解为一个512字节长的片段,并破坏了正弦波,但事

  • 我目前正在创建一个HTML5音乐编辑程序。我从录制音频开始。我想出了如何访问microphon等等。“recorder.js”中的代码帮了我很大的忙。 但我想创建一个临时AudioBuffer,而不是写入.wave文件。我从“OnAudioProcess”事件中的inputtbuffer中获取了Float32Array并将它们一起保存在一个Float32Array中。现在我有一个数组的值,让我们假

  • 我面临的问题,使用MediaPlayer以及原生Android音频播放器播放音频网址。这是我的网址http://live.politiafm.com:8500/politiafm.mp3 这是我的代码使用本机音频播放器Intent意图=new Intent(android.content.Intent。ACTION_VIEW);intent.setDataAndType(Uri.parse(STR

  • 我目前正在使用Web音频API。我设法“读懂”了一个麦克风,并将它播放给我的扬声器,这非常无缝。 使用Web Audio API,我现在想重新取样传入的音频流(又名麦克风)从44.1kHz到16kHz。16kHz,因为我正在使用一些需要16kHz的工具。由于44.1kHz除以16kHz不是整数,我相信我不能简单地使用低通滤波器和“跳过样本”,对吗? 我还看到一些人建议使用,但由于它已被弃用,我觉得

  • 我想做一个网站,将作为一个VoIP录音机应用程序。它将从麦克风获取音频,仅将音频传输到服务器和服务器,然后服务器将处理音频重新分配到其连接的客户端。 以下是我已经尝试过的: WebRTC(据我所知,它只是点对点的) 我设置的堆栈是带有Express的NodeJS,但我对任何有帮助的包都非常开放。 就可能性而言,我知道这是可能的,因为不和谐在他们自己的博客中写道,他们明确不发送点对点数据包,因为他们

  • 0.1 登录监听 登录监听主要是对初始化sdk的参数进行验,并与服务端建立连接 事件监听,建议在初始化sdk后做监听 0.1.1 登录成功 rtc.on('login_success', function (data) { // 登录成功 console.log(data,'login_success'); }); 返回 data 部分数据格式如下 { result: