2015-08-22 6 views
0

Я использую scapy и pyaudio для воспроизведения короткой длины синусоиды каждый раз, когда пакет отправляется или принимается с частотой звука, указывающим адрес отправителя.Аудио-микширование в реальном времени на Python

sniff(prn = makeSound) 

В этом коде функция makeSound принимает пакет, вскрывает его, и играет звук на основе адреса отправителя.

Насколько я знаю, pyaudio имеет либо блокирующий, либо обратный режим. В любом из этих режимов я могу воспроизводить несколько звуков одновременно.

Мне нужен способ начать запись, и сразу же начните смешивать ее с аудиопотоком, независимо от того, сколько синусоидальных волн уже находится в процессе воспроизведения.

+0

Не можете ли вы сжечь их в разных потоках? –

+0

Ручное нарезание резьбы кажется излишним для чего-то подобного. Есть ли пример кода, показывающий, как я это сделаю? – is8ac

+0

Если нарезка кажется слишком большой работой, то как насчет Timer() –

ответ

0

Вам необходимо выполнить микширование самостоятельно. См. Следующую примерную программу о том, как смешивать несколько голосов в один одноканальный выход.

import struct 
import math 
import pyaudio 
from itertools import count 

pa = pyaudio.PyAudio() 

FORMAT = pyaudio.paFloat32 
CHANNELS = 1 
RATE = 44100 

OUTPUT_BLOCK_TIME = 0.05 
OUTPUT_FRAMES_PER_BLOCK = int(RATE*OUTPUT_BLOCK_TIME) 


def sine_gen(): 
    time = 0 
    format = "%df" % OUTPUT_FRAMES_PER_BLOCK 
    voices = [] 
    voices.append(lambda sampletime: math.sin(sampletime * math.pi * 2 * 440.0)) 

    for frame in count(): 
     block = [] 
     for i in xrange(OUTPUT_FRAMES_PER_BLOCK): 
      sampletime = time + (float(i)/OUTPUT_FRAMES_PER_BLOCK) * OUTPUT_BLOCK_TIME 
      sample = sum(voice(sampletime) for voice in voices)/len(voices) 
      block.append(sample) 
     yield struct.pack(format, *block) 
     time += OUTPUT_BLOCK_TIME 
     if frame == 20: 
      voices.append(
       lambda sampletime: math.sin(sampletime * math.pi * 2 * 880.0) 
      ) 

stream = pa.open(format=FORMAT, 
    channels=CHANNELS, rate=RATE, output=1) 

for i, block in enumerate(sine_gen()): 
    stream.write(block)