Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用内部生成的输入实现Pyaudio回调_Python_Callback_Pyaudio - Fatal编程技术网

Python 如何使用内部生成的输入实现Pyaudio回调

Python 如何使用内部生成的输入实现Pyaudio回调,python,callback,pyaudio,Python,Callback,Pyaudio,我有不同时间长度的不同频率的输入音频音调。我试图将这些输入分割成块(大小相同,与输入频率无关),并在输出中清晰地再现这些块。当我使用阻塞方法时,例如stream.write(),我得到了一个干净的输出,但是没有太多的处理能力来处理其他任务。因此,我使用callback()函数将代码转换为非阻塞方法,如下所示 我已经尝试在这篇文章之后对我的代码进行模式化: 但这根本不起作用 #生成一个250 Hz的音块,达到每秒100个音块, #使用非阻塞方法。 # #如何将一个250赫兹的波放入100赫兹的数据

我有不同时间长度的不同频率的输入音频音调。我试图将这些输入分割成块(大小相同,与输入频率无关),并在输出中清晰地再现这些块。当我使用阻塞方法时,例如stream.write(),我得到了一个干净的输出,但是没有太多的处理能力来处理其他任务。因此,我使用callback()函数将代码转换为非阻塞方法,如下所示

我已经尝试在这篇文章之后对我的代码进行模式化: 但这根本不起作用

#生成一个250 Hz的音块,达到每秒100个音块,
#使用非阻塞方法。
#
#如何将一个250赫兹的波放入100赫兹的数据包中?
#将正弦波分为两个半波段:
#
#               |              |              |              |
#  _     _     _|    _     _   | _     _     _|    _     _   | 
# / \   / \   / \   / \   / \   / \   / \   / \   / \   / \   
#    \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/
#               |              |              |              |
#   |  |  |  |
#              
#以交替方式播放每个片段。
#这模拟了不需要过零的连续音频
#出现在块的边缘。
将numpy作为np导入
导入pyaudio
导入时间
#基于https://people.csail.mit.edu/hubert/pyaudio/docs/
def回调(帧内数据、帧计数、时间信息、状态):
waveData=Y.tobytes()
返回(waveData,pyaudio.paccontinue)
Y=np.zero((441),dtype=np.int16)#初始化音频数组Y
p=pyaudio.pyaudio()
stream=p.open(格式=8,#8是int16格式的代码
通道=1,
费率=44100,
每个缓冲区的帧数=441,
stream_callback=callback,#!!注释掉以启用阻塞
输出=真)
stream.start_stream()
X1=np.linspace(0,5*np.pi,num=441,endpoint=False)
Y1=(5000*np.sin(X1)).aType(np.int16)#产生两个半波
X2=np.linspace(5*np.pi,10*np.pi,num=441,endpoint=False)
Y2=(5000*np.sin(X2)).aType(np.int16)#“其他”两个半波
#依次播放两个波段
#结果应该是一个干净的250赫兹音调
尽管如此:
Y=Y1#第一组波
时间。睡眠(0.0015)#这是1.5毫秒的延迟
#模拟其他正在发生的事情
#在While循环中。
#stream.write(Y.tobytes())#!!取消注释以使用阻塞方法
Y=Y2#第二组波
时间。睡眠(0.0015)#更多杂项延迟
#stream.write(Y.tobytes())#!!取消注释以使用阻塞方法
期望无失真(数字音频)正弦波,并得到严重失真的声音,像一个巨大的电影怪物的咆哮。
通常不会出现错误消息,但如果time.sleep值增加,则可能会出现运行不足。另外,如果完全删除time.sleep语句,问题也会消失,但使用该语句的完整应用程序每个块至少有1.5毫秒的处理负载。

要部分回答我自己的问题,关键是使用队列在主循环和回调函数之间传输数据。现在声音没有失真。但是,阻塞似乎对While循环中运行的每个语句的执行时间有重大影响。当然,整个循环会变慢,但它以正确的刷新率循环。我希望看到循环中的语句以正常速度运行,但它们都以正常速度的1/5左右运行

#生成一个250 Hz的音块,达到每秒100个音块,
#使用非阻塞方法。
#
#如何将一个250赫兹的波放入100赫兹的数据包中?
#将正弦波分为两个半波段:
#
#               |              |              |              |
#  _     _     _|    _     _   | _     _     _|    _     _   | 
# / \   / \   / \   / \   / \   / \   / \   / \   / \   / \   
#    \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/   \_/
#               |              |              |              |
#   |  |  |  |
#              
#以交替方式播放每个片段。
#这模拟了不需要过零的连续音频
#出现在块的边缘。
将numpy作为np导入
导入pyaudio
导入时间
导入队列
#基于https://people.csail.mit.edu/hubert/pyaudio/docs/
def回调(帧内数据、帧计数、时间信息、状态):
Y=qu.get()
waveData=Y.tobytes()
返回(waveData,pyaudio.paccontinue)
qu=队列。队列(maxsize=1)#1个完整缓冲区(长度441)
Y=np.zero((441),dtype=np.int16)#初始化音频数组Y
p=pyaudio.pyaudio()
stream=p.open(格式=8,#8是int16格式的代码
通道=1,
费率=44100,
每个缓冲区的帧数=441,
stream_callback=回调,
输出=真)
stream.start_stream()
X1=np.linspace(0,5*np.pi,num=441,endpoint=False)
Y1=(5000*np.sin(X1)).aType(np.int16)#产生两个半波
X2=np.linspace(5*np.pi,10*np.pi,num=441,endpoint=False)
Y2=(5000*np.sin(X2)).aType(np.int16)#“其他”两个半波
#依次播放两个波段
#结果应该是一个干净的250赫兹音调
尽管如此:
qu.put(Y1)#第一组波
时间。睡眠(0.0015)#这是1.5毫秒的延迟
#模拟其他正在发生的事情
#在While循环中。
qu.put(Y2)#Seco