Last active
January 13, 2019 12:12
-
-
Save JarbasAl/4f6ff67d477d4bdcf70e8d18b44f334e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| import pyaudio | |
| import socket | |
| class AudioStreamer(object): | |
| def __init__(self, host='0.0.0.0', port=50000, backlog=5, chunk=1024, | |
| channels=1, rate=16000, pa=None): | |
| self.rate = rate | |
| self.channels = channels | |
| if pa is None: | |
| self.pa = pyaudio.PyAudio() | |
| # Socket Initialization | |
| self.host = host | |
| self.port = port | |
| self.backlog = backlog | |
| self.chunk = chunk | |
| self.stream = self.pa.open(format=pyaudio.paInt16, | |
| channels=self.channels, | |
| rate=self.rate, | |
| input=True, | |
| frames_per_buffer=self.chunk) | |
| def init_socket(self): | |
| try: | |
| self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| self.sock.connect((self.host, self.port)) | |
| print("client connected") | |
| except ConnectionRefusedError: | |
| print("can not connect to server, verify host and port") | |
| raise | |
| def run(self): | |
| self.init_socket() | |
| print("streaming audio") | |
| # Main Functionality | |
| while True: | |
| try: | |
| data = self.stream.read(self.chunk) | |
| self.sock.send(data) | |
| ans = self.sock.recv(self.chunk).decode("utf-8") | |
| if "busy" in ans: | |
| print("server is busy") | |
| break | |
| except BrokenPipeError: | |
| print("server connection crashed") | |
| break | |
| except ConnectionResetError: | |
| print("server reset connection") | |
| break | |
| except KeyboardInterrupt: | |
| print("closing connection") | |
| break | |
| def close(self): | |
| self.stream.close() | |
| self.pa.terminate() | |
| print("Client has stopped running") | |
| if __name__ == "__main__": | |
| receiver = AudioStreamer() | |
| receiver.run() | |
| receiver.close() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| import pyaudio | |
| import socket | |
| from threading import Thread | |
| class AudioReceiver(object): | |
| def __init__(self, host='0.0.0.0', port=50000, backlog=5, chunk=1024, | |
| channels=1, rate=16000, pa=None): | |
| self.rate = rate | |
| self.channels = channels | |
| if pa is None: | |
| self.pa = pyaudio.PyAudio() | |
| # Socket Initialization | |
| self.host = host | |
| self.port = port | |
| self.backlog = backlog | |
| self.chunk = chunk | |
| # Opening of the audio stream | |
| self.stream = self.pa.open(format=pyaudio.paInt16, | |
| channels=self.channels, | |
| rate=self.rate, | |
| output=True, | |
| frames_per_buffer=self.chunk) | |
| self.init_socket() | |
| self.clients = {} | |
| self.on_call = False | |
| def init_socket(self): | |
| self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| self.sock.bind((self.host, self.port)) | |
| self.sock.listen(self.backlog) | |
| print("socket open") | |
| def on_new_client(self, client, addr): | |
| self.on_call = True | |
| print("Listening to incoming stream from ", addr) | |
| while True: | |
| try: | |
| data = client.recv(self.chunk) | |
| if data: | |
| # Write data to pyaudio stream | |
| self.stream.write(data) # Stream the recieved audio data | |
| client.send(b'ACK') # Send an ACK | |
| except KeyboardInterrupt: | |
| print("server closed by user") | |
| break | |
| except ConnectionResetError as e: | |
| print("client disconnected") | |
| break | |
| except Exception as e: | |
| print(e) | |
| break | |
| client.close() | |
| self.on_call = False | |
| def run(self): | |
| # Main Functionality | |
| while True: | |
| if self.on_call: | |
| client, address = self.sock.accept() | |
| client.send(b'busy') # Send an ACK | |
| client.close() | |
| else: | |
| client, address = self.sock.accept() | |
| thread = Thread(target=self.on_new_client, | |
| args=(client, address), | |
| daemon=True).start() | |
| self.clients[address] = thread | |
| def close(self): | |
| self.stream.close() | |
| self.pa.terminate() | |
| print("Server has stopped running") | |
| if __name__ == "__main__": | |
| receiver = AudioReceiver() | |
| receiver.run() | |
| receiver.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment