Я использую pyaudio в режиме обратного вызова с форматом paFloat32
, 2 каналами, 1024 кадрами на буфер, и меня интересует более эффективный обмен данными аудио-буфера ввода-вывода.PyAudio: Каков наиболее эффективный формат и пакет/метод распаковки для использования в режиме обратного вызова?
Для распаковки входных звукового буфера и получить список образцов поплавка, я использую:
fmt = str(N_CHANNELS * BUFFER_SIZE) + 'f'
in_floats = struct.unpack(fmt, in_data)
Использования struct.pack()
и struct.unpack()
весьма неэффективен и требует значительных ресурсов центрального процессора, почти такие же, как при обработке звукового сигнала сам. Поскольку большинство звуковых карт 16 бит, я также пытался использовать формат paInt16
, но результаты почти идентичны.
Каким будет наиболее эффективный формат и метод pack/unpack для использования в режиме обратного вызова (конечно, поддерживая полное разрешение)?
Редактировать: PyAudio обменивается данными, используя двоичные потоки или буферы, аналогичные структурам данных C, используемым с Portaudio. Мне нужно распаковать входной буфер in_data
, чтобы получить образцы с плавающей точкой и проанализировать их. Все в порядке, за исключением того, что распаковка немного медленная.
'struct' относительно быстро. Если вам нужно что-то быстрее, вы, вероятно, не хотите использовать python для задания. Вы можете попытаться написать обратный вызов на C или вообще не распаковывать – goncalopp
Вы также можете попробовать 'numpy', но поскольку вы имеете дело с относительно небольшими буферами, накладные расходы могут быть достаточно большими, чтобы свести на нет выгоду – goncalopp
Зачем вам нужно упаковать и распаковать данные? Во всяком случае, numpy 'frombuffer' может быть вам полезен здесь. Http://docs.scipy.org/doc/numpy/reference/generated/numpy.frombuffer.html#numpy.frombuffer. Если вы хотите следить, пожалуйста, напишите некоторый минимальный, но функциональный код, чтобы мы могли видеть, что вы пытаетесь сделать. – tom10