2013-01-07 2 views
0

Я пытаюсь понять что-то, что я вижу в PyAudio. Я пытаюсь взять образец аудио 200 мс, подождать несколько секунд, а затем взять еще три 200 мс аудио. Рассмотрим этот код:Поведение PyAudio во время time.sleep()

import pyaudio 
import time 

p = pyaudio.PyAudio() 
chunk = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 1 #chan 
RATE = 11025 
stream = p.open(format = FORMAT, 
      channels = CHANNELS, 
      rate = RATE, 
      input = True, 
      output = False, 
      frames_per_buffer = chunk, 
      input_device_index = 0, 
      output_device_index = 0) 

def record(seconds): 
all = [] 
for i in range(0, int(RATE/chunk * seconds)): 
    data = stream.read(chunk) 

    all.append(data) 
data = ''.join(all) 
return data 

#record 200ms of sound 
print "pre-record 1 " + str(time.time()) 
data = record(.2) 
print "post-record 1 " + str(time.time()) 

#sleep for one second 
#time.sleep(1) 

#record 200ms of sound 
print "pre-record 2 " + str(time.time()) 
data = record(.2) 
print "post-record 2 " + str(time.time()) 

print "pre-record 3 " + str(time.time()) 
data = record(.2) 
print "post-record 3 " + str(time.time()) 

print "pre-record 4 " + str(time.time()) 
data = record(.2) 
print "post-record 4 " + str(time.time()) 

Если я запускаю это «как есть» (т.е. с time.sleep() закомментированного), я получаю это, что имеет смысл:

pre-record 1 1357526364.46 
post-record 1 1357526364.67 
pre-record 2 1357526364.67 
post-record 2 1357526364.86 
pre-record 3 1357526364.86 
post-record 3 1357526365.03 
pre-record 4 1357526365.03 
post-record 4 1357526365.22 

Если бы я тогда раскомментируйте время. сон() линия, чтобы добавить одну вторую задержки между первой и второй записью, я получаю это:

pre-record 1 1357525897.09 
post-record 1 1357525897.28 
pre-record 2 1357525898.28 
post-record 2 1357525898.28 
pre-record 3 1357525898.28 
post-record 3 1357525898.28 
pre-record 4 1357525898.28 
post-record 4 1357525898.47 

Обратите внимание, что в то время как есть один-вторая задержка в метках времени между первой и второй записью, þér e не задерживается между записями 2 и 3, и они, кажется, были взяты за нулевое время (хотя на самом деле они содержат 200 мс данных). Кажется, что запись четыре взяла 200 мс, но была запущена одновременно с записями 2 и 3.

Если я заменил time.sleep(1) на record(1) (и не сохранял/не использовал данные с 1-секундной записи), программа ведет себя, как я ожидаю:

pre-record 1 1357526802.57 
post-record 1 1357526802.77 
pre-record 2 1357526803.69 
post-record 2 1357526803.88 
pre-record 3 1357526803.88 
post-record 3 1357526804.06 
pre-record 4 1357526804.06 
post-record 4 1357526804.25 

так, казалось бы, что даже во время time.sleep(1), буфер где-то по-прежнему подается звук, и когда я вызываю функцию записи после сна, это захват аудио из этого буфера , который не является звуком, который я хочу. Мне нужен звук после сна, а не во время его. Может ли кто-нибудь помочь мне понять взаимодействие PyAudio с любым буфером, и есть ли способ лучше узнать, в какое время мой звук был фактически захвачен?

ответ

0

Аудиоустройство непрерывно добавляет образцы RATE в секунду в буфер, а ваш код считывается из этого буфера.

Так что вы не можете спать (1), не читая из буфера. Вы можете написать код для пропусков образцов:

def skip(seconds): 
    samples = int(seconds * RATE) 
    count = 0 
    while count < samples: 
     stream.read(chunk) 
     count += chunk 
     time.sleep(0.01) 
+0

Спасибо, это очень полезно. Вы знаете, имеет ли буфер определенный размер? Если вы посмотрите на второй пример выше, похоже, что запись 4 на самом деле заняла 200 мс для завершения, что, по-видимому, указывает на то, что, возможно, буфер может содержать только данные на 400 мс на этом СКОРОСТИ? – aaknitt

+1

Чтобы частично ответить на мой собственный вопрос, есть хорошее обсуждение размера буфера здесь: http://www.portaudio.com/docs/latency.html Похоже, есть функция PortAudio 'Pa_GetMinNumBuffers (int framesPerBuffer, double sampleRate) ', который вернет размер буфера, но я еще не нашел этого в PyAudio. Однако, вызывая функцию 'get_read_available()', я могу получить представление о том, как работает буфер. – aaknitt

+0

Кроме того, похоже, что вызов 'stream.stop_stream()' до 'time.sleep (1)' остановит аудиоустройство от добавления в буфер, а затем вызывает 'stream.start_stream()' после перезапуска сна добавление в буфер. Сроки, похоже, работают, делая это. – aaknitt

Смежные вопросы