Использование одного потока pyaudio для чтения и записи данных - PullRequest
0 голосов
/ 14 января 2019

У меня есть клиент веб-сокета, который отправляет двоичные аудиоданные в запросе и получает их в ответ от сервера веб-сокета. Я использую pyaudio для чтения двоичных аудиоданных (файл / микрофон), которые я затем отправляю на сервер. Затем в качестве ответа я получаю другие двоичные аудиоданные с сервера. Вопрос в том, могу ли я использовать свой недавно открытый поток чтения pyaudio для воспроизведения принимаемого звука в режиме реального времени или мне лучше создать другой поток pyaudio (есть два потока, один из которых отвечает за чтение двоичных данных, а другой - за запись двоичных данных)?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Нет причин создавать два потока. Это прекрасно для чтения и записи в одной функции обратного вызова потока. Просто создайте поток в «неблокирующем» режиме (т. Е. Указав функцию обратного вызова).

Вам просто нужно убедиться, что вы используете достаточно большой буфер на тот случай, если сетевое соединение в какой-то момент займет немного больше времени, чем в среднем. Вы должны использовать какую-то очередь для перемещения данных между потоками, например, queue.Queue из стандартной библиотеки Python.

Также нет необходимости создавать отдельные темы. Если вы используете поток PyAudio с функцией обратного вызова, эта функция автоматически вызывается в отдельном потоке (который автоматически создается базовой библиотекой PortAudio).

Сказав это, вы можете, конечно, создать несколько потоков, если они вам нужны по какой-то другой причине. Кроме того, вы можете создавать темы, если они вам нужны.

0 голосов
/ 14 января 2019

помните о том, что, насколько я знаю, чтение потоковых данных является своего рода генератором процесса. Когда вы читаете его, вы теряете данные. Другими словами: основываясь на вашем чанке, вы при каждом «чтении» перемещаете указатель, который захватывает ваши двоичные данные.

Ответ

Почему бы вам не создать 2 потока с 2 потоками? Не бойся потоков. Вы можете инициализировать столько, сколько хотите.

  • 1 поток получает двоичные данные и передает их в поток (от клиента к звуковому устройству)
  • 2 потока получают данные из вашего входного потока (в двоичном виде с вашего микрофона), и вы отправляете их на свой клиент?

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

Примечание:

Также я хотел сказать, что вам не нужно беспокоиться об использовании потоков. Потоки работают в пакетном режиме, а не в реальном времени. Будь то чтение или запись, это работает так, что у вас есть двоичные данные, которые вы помещаете в поток, и все готово. Аппаратное обеспечение принимает двоичные данные, передает их в поток и только после его завершения поток запрашивает другие данные. Так что если у вас есть sample_rate 44100 и порция 22050 (только пример), ваш цикл будет всего 0,5 с. Так что вам даже не нужно беспокоиться о переполнении, слишком большом количестве данных для обработки или о том, что ваши потоки становятся сумасшедшими. Фактически, в тот момент, когда вы отправляете данные в поток, ваш питон ждет, пока ваше оборудование завершит работу. Очень легкий.

...