如何更新声音设备的采样器?

2024-04-25 17:01:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用标准流同时从麦克风输出声音和录音。我需要能够同时得到输入和输出的音频处理实时,这就是为什么我使用流。如果我使用所有使用同一个samplerate的文件,这很好。如果我有一些音频文件没有相同的samplerate,我需要能够更改Stream使用的samplerate。在

try:
    stream = sd.Stream(device=(args.input_device, args.output_device),
                        samplerate=args.samplerate, blocksize=args.blocksize,
                        dtype='float32', latency=(0, 0),
                        channels=len(args.channels), callback=callback, finished_callback=finished_callback)
    with stream:
        ani = FuncAnimation(fig, update_plot, interval=args.interval, blit=False, init_func=plot_init)
        plt.show()

我的第一次尝试是在完成的\u回调中关闭流:

^{pr2}$

然后在更新图中重新打开一个流:

^{3}$

重新打开这条河似乎没有任何效果。我相信这样做的原因是,在我之前使用的新流之后,我没有任何阻塞(表演). 我不能在这一部分有任何阻碍,因为这是我更新我的情节。有没有一种方法可以在溪流已经打开之后改变它的取样器,或者有其他方法来完成我正在尝试的工作?在


Tags: 方法声音stream标准plotinitdevicecallback
1条回答
网友
1楼 · 发布于 2024-04-25 17:01:16

首先,如果你有不同采样率的文件,你应该考虑重新采样(也就是采样率转换)。这就是通常用来解决你的问题的方法。在

其次,PortAudio(位于sounddevice模块后面的C库)不支持更改现有流的采样率。如果你真的需要的话,还有其他的音频框架理论上支持它(例如JACK)。在

第三,如果您确实需要具有不同采样率的流,您当然可以关闭一个流,然后打开另一个具有不同采样率的流。在某些平台上,您甚至可以同时拥有多个流(可能具有不同的设置)。在

您不应该关闭finished_callback中的流,实际上您不应该从其中的sounddevice模块调用任何函数。在

update_plot回调中创建一个流可能不是一个好主意,因为当变量超出范围时,它会被破坏(这发生得非常快,因为函数通常很短)。在

您可能应该创建一个单独的线程来绘制和处理主线程中停止和重新启动音频流(反之亦然)。在

相关问题 更多 >