尝试从麦克风录制并实时播放

时间:2011-08-18 05:13:04

标签: python audio-streaming audio-recording playback alsa

我正在尝试从麦克风录制数据,然后通过扬声器实时播放,并且有一些延迟,但我遇到了一些问题。我选择使用python和alsaaudio,我可以找到我遇到问题的当前脚本here。这适用于我迄今为止所拥有的(不是延迟部分),但会产生一些点击。 alsaaudio docs有this说:

  

播放PCM音频时出现问题的最常见原因是对PCM设备的写入必须与设备的数据速率完全匹配。

     

如果向设备写入的数据太少,则会发生欠载,并且会发出丑陋的咔嗒声。相反,如果将太多数据写入器件,写入功能将阻塞(PCM_NORMAL模式)或返回零(PCM_NONBLOCK模式)。

我似乎误解了文档,它说的是关于write():

  

PCM.write(数据)

     

在数据中写入(播放)声音。数据长度必须是帧大小的倍数,并且应该与句点的大小完全相同

我脚本中的一段时间是160。

它说的是关于read():

  

在PCM_NORMAL模式下,此功能将阻塞直到整个周期可用,然后返回一个元组(长度,数据),其中length是捕获数据的帧数,而数据是捕获的声音帧作为字符串。返回数据的长度为periodsize * framesize bytes。

在我的脚本中,period_size * frame_size也应该等于160,但是当我打印长度(元组read()的一部分返回)我得到940.显然我似乎没有传递适量的数据out.write(),但我不知道该去哪里。我把这些代码放在一起,主要是通过我发现的例子,我刚开始使用alsaaudio / sound,尝试组合一些有趣的项目,所以我还不知道很多。

我还想从麦克风录制直播,然后以100毫秒的延迟播放,因此注释了time.sleep()。如果我取消注释它,长度似乎重复从940到-32,最终导致out.write()抛出异常(没有足够的数据)。

有人能告诉我如何(或我的剧本有什么问题)我会实时录制和播放声音数据,并延迟100毫秒?

2 个答案:

答案 0 :(得分:1)

你不能使用睡眠(0.1)将输出延迟100ms。你需要创建一个保存100ms音频数据的缓冲区:

buf = []
while True:
    l, data = inp.read()
    buf.append(data)
    if len(buffer)>=10:
        out.write(buf[0])
        del buf[0]

将10改为某个会导致100ms延迟的数字。

答案 1 :(得分:0)

你尝试过alsaloop吗?试试" man alsaloop"。您也可以通过该命令选择延迟。