class VoIPAlsaOutgoingCall(VoIPOutgoingCall): def __init__(self, *args, **kwargs): super(VoIPAlsaOutgoingCall, self).__init__(*args, **kwargs) self.playback_device = None self.capture_device = None self.ctrl.set_send_audio_frame_callback(self._read_frame) self.ctrl.set_recv_audio_frame_callback(self._write_frame) def build_capture_device(self): self.capture_device = PCM(PCM_CAPTURE, PCM_NONBLOCK) self.capture_device.setrate(48000) self.capture_device.setperiodsize(960) self.capture_device.setchannels(1) def build_playback_device(self): self.playback_device = PCM(mode=PCM_NONBLOCK) self.playback_device.setrate(48000) self.playback_device.setperiodsize(960) self.playback_device.setchannels(1) def _read_frame(self, length: int): if not self.capture_device: self.build_capture_device() _, frame = self.capture_device.read() return frame def _write_frame(self, frame: bytes): if not self.playback_device: self.build_playback_device() self.playback_device.write(frame)
class AudioCapture(object): def __init__(self): os = system() if os == 'Windows': self.usuario = environ['USERNAME'] else: self.usuario = environ['USER'] try: self.capturarAudio() self.guardarAudio() except Exception as e: print e def capturarAudio(self): self.captura = PCM(PCM_CAPTURE) self.captura.setchannels(1) # default 2 self.captura.setrate(44100) # default 44100 self.captura.setformat(PCM_FORMAT_S16_LE) # default PCM_FORMAT_S16_LE self.captura.setperiodsize(1024) # default 32 def guardarAudio(self): if not 'audio' in listdir('./'): mkdir('audio') tiempo = strftime("%d %b %Y_%H:%M:%S", gmtime()) miAudio = './audio/' + self.usuario + '_' + tiempo + '.wav' audio = wave.open(miAudio, 'w') audio.setnchannels(1) audio.setsampwidth(2) audio.setframerate(44100) while True: try: length, data = self.captura.read() audio.writeframes(data) except KeyboardInterrupt: break