【发布时间】:2010-06-10 20:44:49
【问题描述】:
我目前正在尝试用 python 编写语音聊天程序。欢迎所有提示/技巧来做到这一点。
到目前为止,我发现 pyAudio 是 PortAudio 的包装器。所以我玩弄了它,并从我的麦克风获得了一个输入流,以回放到我的扬声器。当然只有 RAW。
但是我不能通过网络发送 RAW 数据(由于大小 duh),所以我正在寻找一种对其进行编码的方法。我在网上搜索并偶然发现了this speex-wrapper 的python。这似乎是真的,相信我,确实如此。
您在 pyAudio 中看到,您可以设置要从输入音频缓冲区中获取的块的大小,在链接上的示例代码中,它被设置为 320。然后当它被编码时,它就像大约 40 个字节的数据每块,我猜这是相当可以接受的。现在解决问题。
我启动了一个示例程序,它只接受输入流,对块进行编码,解码并播放它们(由于测试不通过网络发送)。如果我只是让我的计算机空闲并运行这个程序,它会很好用,但是一旦我做某事,即启动 Firefox 或其他东西,音频输入缓冲区就会全部堵塞!它只是增长,然后它全部崩溃并在缓冲区上给我一个溢出错误..
好的,那为什么我只占用 320 字节的流?我可以只占用 1024 字节之类的东西,这样可以减轻缓冲区的压力。但。如果我给 speex 1024 字节的数据进行编码/解码,它要么崩溃,要么说那对于它的缓冲区来说太大了。或者它对其进行编码/解码,但声音非常嘈杂且“断断续续”,就好像它只编码了 1024 块的一小部分,其余的是静态噪声。所以声音听起来像直升机,哈哈。
我做了一些研究,似乎 speex 一次只能转换 320 字节的数据,而对于宽带,640 字节。但这是标准吗? 我该如何解决这个问题?我应该如何构建我的程序以使用 speex?我可以使用一个中间缓冲区,它将所有可用数据从缓冲区中读取,然后将其分成 320 位并对其进行编码/解码。但这需要更长的时间,而且似乎是一个非常糟糕的问题解决方案..
因为据我所知,没有其他 Python 编码器可以对音频进行编码,因此它可以通过网络以可接受的小包形式发送,或者?我已经用谷歌搜索了三天了。
还有这个pyMedia库,不知道这种软件转换成mp3/ogg好不好。
提前感谢您阅读本文,希望任何人都可以帮助我! (:
【问题讨论】:
标签: python networking tcp voip speex