Попытка записи с микрофона и воспроизведения в режиме реального времени - PullRequest
9 голосов
/ 18 августа 2011

Я пытаюсь записать данные с моего микрофона, а затем воспроизвести их через динамики в режиме реального времени и с некоторыми задержками, но у меня возникают некоторые проблемы с этим. Я решил использовать python и alsaaudio, и мой текущий скрипт, с которым у меня проблемы, можно найти здесь . Это работает с тем, что я имею далеко (не часть задержки), но производит некоторые щелчки. У alsaaudio docs есть это , чтобы сказать:

Самая распространенная причина проблем с воспроизведением звука PCM заключается в том, что запись на устройства PCM должна точно соответствовать скорости передачи данных устройства.

Если на устройство записано слишком мало данных, оно опустошится, и произойдут неприятные звуки щелчка. И наоборот, если на устройство записывается слишком много данных, функция записи либо блокирует (режим PCM_NORMAL), либо возвращает ноль (режим PCM_NONBLOCK).

Я, кажется, неправильно понимаю документы, это говорит о write ():

PCM.write (данные)

Запись (воспроизведение) звука в данные. Длина данных должна быть кратна размеру кадра и должна точно соответствовать периоду

период в моем сценарии 160.

это говорит об read ():

В режиме PCM_NORMAL эта функция блокируется до тех пор, пока не будет доступен полный период, а затем возвращает кортеж (длина, данные), где длина - это количество кадров захваченных данных, а данные - это захваченные звуковые кадры в виде строки. Длина возвращаемых данных будет равна periodses * framestes bytes.

в моем сценарии period_size * frame_size также должен быть равен 160, но когда я печатаю длину (возвращается часть кортежа read ()), я получаю 940. Очевидно, я, кажется, не передаю нужное количество данных out.write (), но я не уверен, куда идти. Я собрал этот код в основном на примерах, которые нашел, и я только начал работать с alsaaudio / sound, пытаясь собрать несколько интересных проектов, так что я пока не очень много знаю.

Я также хотел записать в прямом эфире с микрофона, затем воспроизвести с задержкой в ​​100 мс, отсюда и закомментированное время.sleep (). Если я раскомментирую его, длина, по-видимому, будет неоднократно увеличиваться с 940 до -32, что в конечном итоге приведет к тому, что out.write () сгенерирует исключение (недостаточно данных).

Может ли кто-нибудь сказать мне, как (или что не так с моим сценарием) я могу записывать и воспроизводить звуковые данные в режиме реального времени с задержкой в ​​100 мс?

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Вы не можете использовать sleep (0.1) для задержки вывода на 100 мс.вам нужно создать буфер, который будет содержать аудиоданные 100 мс:

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

замените 10 на некоторое число, которое вызовет задержку 100 мс.

0 голосов
/ 02 октября 2012

Вы пробовали alsaloop?Попробуйте "человек alsaloop".С помощью этой команды вы также можете выбрать время ожидания.

...