将音频缓冲区从 Python 脚本传输到 Go 服务器?

Posted

技术标签:

【中文标题】将音频缓冲区从 Python 脚本传输到 Go 服务器?【英文标题】:Transfer audio buffers from a Python script to a Go server? 【发布时间】:2017-07-10 14:08:08 【问题描述】:

我是一名初学者,试图找到一种在本地服务器上流式传输音频的方法。我有一个 Python 脚本,可以从机器人的麦克风创建一些二进制数据,我想发送这些数据以显示在我创建的本地 Go 服务器上。

我在某处读到网络套接字可能是一种解决方案。 但是从 Python 脚本上传音频缓冲区的最简单方法是什么?我将如何检索这些原始二进制数据,以便可以从 Web 应用程序流式传输?

非常感谢。

【问题讨论】:

【参考方案1】:

没有单一的“最佳”方式。如果协议必须通过开放互联网上的端口 80/443,您可以使用 web-sockets。您还可以将来自 python 的 base64 编码数据块发布回您的服务器。

如果机器人和服务器在同一网络上,您可以将 UDP 数据包从机器人发送到您的服务器。 (通常在音频上丢失一两个数据包不是问题)。即使你有一个基于 Web 的 Go 服务器,你仍然可以启动一个 go 例程来监听 UDP 的传入数据包。

如果您可以更具体一些,也许我或其他人可以给出更好的答案?

【讨论】:

啊,是的,机器人和服务器在同一个网络上,这是我的 Go 脚本:link,我的 python 脚本基本上是这个 Q link 的答案。所以你说我需要在我的 Python 脚本中使用二进制数据(保​​存为 .raw)创建 UDP 数据包,并在我的 Go 脚本中监听它们。我是否将数据转换为十六进制?然后我如何将这些数据转换为 .WAV 或其他可播放的音乐格式?谢谢。 通常音频是 8 位 PCM。 Numpy 看起来它正在将数据转换为数字(它们应该在 0 到 255 之间),每个通道有一列。你应该能够一次base64 1000字节(为什么是1000?因为以太网默认是1500字节)。将其编码为 base64,大约 1300 字节。将其作为 UDP 数据包发送到您的 Go 服务器,然后可能类似于 github.com/cryptix/wav 将其重新编码为 WAV 文件。希望您可以将该 WAV 文件写入混音器或音频设备。但我从未尝试过最后一部分。 谢谢,但仍有困难。这是我的 Python 代码link 的 processRemote 方法,我设法通过 UDP 发送测试数据 (PACKETDATA) 并设法让 Go 接收它。但是我的技能水平是初学者,我不确定我到底需要发送什么。我有一个名为“aSoundData”的变量,它可能是音频,但是当我打印它时,它显示的数字超过 255,那么这可能是什么类型的数据以及如何将其转换为十六进制?它看起来像这样:[[ 408 -283 -962 ..., 1546 1784 1946] (有3行这样的) 看起来 naoqi 不是以 PCM 形式发送数据,而是与 Linux ALSA 声音驱动程序相关的东西。它使用 16 位音频信号。 (我怀疑它实际上是未签名的)。恐怕我对那个特定的声音协议了解不多。您仍然可以将其编码为 base64 并在网络上一次发送 500 个样本。然后将其解码并将其发送到您的声音设备,看看会发生什么。如果它是 ALSA 编码的东西,并且您将其发送到 ALSA 设备 - 也许它可以正常工作?

以上是关于将音频缓冲区从 Python 脚本传输到 Go 服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何实时流式传输音频文件

将音频和视频块从 python 中传输到 ffmpeg 的最佳方法

将音频缓冲区从 44100 重新采样到 16000

在 Android 上使用 OpenSL ES 通过套接字通信流式传输 MP3 音频

尝试从 youtube 视频流式传输音频时,DiscordJS v13 AudioPlayer 卡在缓冲上

IOS同步音乐流媒体