2016-07-05 87 views
1

下面的代码一直导致缓冲区欠载。 synth_instance.play返回大小为(frames_num * 2)的浮点数(-1,1)中交错立体帧的列表。Python/PyAudio - 缓冲区欠载

在我看来,stream.write并没有写出我出于某种原因提供它的所有框架。

我试过在回调模式下使用pyaudio,但我不知道如何在时间内提供足够的帧。我的主循环无法赶上通过音频块的队列提供音频。音频回调总是以比我提供的更快的速度播放所有音频块。

#!/usr/bin/python3 

import pyaudio 
import time 
import struct 

from synth import synth 

from time import sleep 
from time import clock 

p = pyaudio.PyAudio() 

sample_rate = 44100 
frames_num = 2205 

synth_instance = synth(); 

stream = p.open(rate=sample_rate, 
      channels=2, 
      format=pyaudio.paFloat32, 
      frames_per_buffer=frames_num, 
      output=True) 

while (True): 

    audio = synth_instance.play_note(-12, sample_rate, frames_num) 

    data = struct.pack('f'*len(audio), *audio) 

    stream.write(data, frames_num) 

回答

0

OP在这里。我会发布我认为是人们搜索的答案。如果我错了,如果有人知道更多的知识,请纠正我,因为我只是学习编程音频和低级编程。

问题是,对于任何实时音频内容,Python都太慢了。

如果你不知道如何优化你的代码,即使C可能太慢。

如果你使用C语言进行编程,例如,如果你使用环缓冲来将东西从主循环移动到音频线程,那么似乎在主循环中执行太多浮点操作会导致音频线程赶上导致口吃的原因。

所以答案是让你的主循环更快或让音频线程更慢。

+0

大家都知道python很慢,但是我们可以用python实时做很多事情,看看[这里](https://www.youtube.com/watch?v=YT-zAX3S850 )while循环python很慢尝试''' – ederwander

+0

如果你想编写一个真正的低延迟应用程序然后不,你可能不应该使用python或者你需要用C编写你的关键代码并使用扩展。无论如何,你没有提到你要做什么延迟以及你在音频流上执行什么样的操作/操作,所以别人不可能说你在Python中是否可行。 – toes