Ich habe keine Ahnung, wie dieses Problem zu lösen. Bitte helfen Sie mir :)UDP-Sound-Übertragung: gespielt Sound haben großes Rauschen
Ich möchte Tondaten, die von einem PC aufgenommen wurden, an den anderen PC senden und abspielen. (von UDP)
Das Programm funktioniert möglicherweise korrekt, aber der Ton enthält (?) unangenehmes Rauschen. wenn ich versuchte, & in einer Programmsequenz Ton zu spielen, funktionierte es richtig. Es gab keinen Lärm. Wenn Sie UDP auch in einem PC verwenden, verwenden Sie IP 127.0.0.1, das Rauschen ist aufgetreten. Zuerst dachte ich, der Faktor liegt daran, dass der Sound auf dem anderen PC aus ist, und ich habe ihn mit einem Puffer repariert. Es löste wenig Lärm, aber fast alle Geräusche sind noch vorhanden.
der folgende Code ist es
Kunde
import pyaudio
import socket
from threading import Thread
frames = []
def udpStream():
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
if len(frames) > 0:
udp.sendto(frames.pop(0), ("127.0.0.1", 12345))
udp.close()
def record(stream, CHUNK):
while True:
frames.append(stream.read(CHUNK))
if __name__ == "__main__":
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE,
input = True,
frames_per_buffer = CHUNK,
)
Tr = Thread(target = record, args = (stream, CHUNK,))
Ts = Thread(target = udpStream)
Tr.setDaemon(True)
Ts.setDaemon(True)
Tr.start()
Ts.start()
Tr.join()
Ts.join()
Server
import pyaudio
import socket
from threading import Thread
frames = []
def udpStream(CHUNK):
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.bind(("127.0.0.1", 12345))
while True:
soundData, addr = udp.recvfrom(CHUNK)
frames.append(soundData)
udp.close()
def play(stream, CHUNK):
BUFFER = 10
while True:
if len(frames) == BUFFER:
while True:
stream.write(frames.pop(0), CHUNK)
if __name__ == "__main__":
FORMAT = pyaudio.paInt16
CHUNK = 1024
CHANNELS = 2
RATE = 44100
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels = CHANNELS,
rate = RATE,
output = True,
frames_per_buffer = CHUNK,
)
Ts = Thread(target = udpStream, args=(CHUNK,))
Tp = Thread(target = play, args=(stream, CHUNK,))
Ts.setDaemon(True)
Tp.setDaemon(True)
Ts.start()
Tp.start()
Ts.join()
Tp.join()
sorry für lange Quellcode. Fühlen Sie sich frei, dieses Programm zu spielen.
Ist es verrauscht (dh werden die Daten korrumpiert (zB durch Paketverlust oder durch falsche Datenverarbeitung)) oder stottert es (dh gibt es ein Problem mit Timing/Latenz/Nebenläufigkeit (ich bin überhaupt nicht Sicher, ob Pythons "threading" die richtige Wahl ist, um den Stream zu entkoppeln und den Stream abzuspielen. –
Sie sollten das gesendete und das empfangene Material miteinander vergleichen. Vielleicht ist es anders. Ich könnte mir vorstellen, dass die Netzwerkschicht hoch und hoch schaltet Low-Byte auf Ihre Daten oder ähnliche Dinge.Das würde zu drastischen Lärm führen. – Alfe
@ Jan-PhilipGehrcke Ich habe nicht über Paketverlust bemerkt, weil die Version von 'Image' UDP-Transfer funktionierte richtig, als ich es versuchte. Danke! Denken Sie über Paketverlust nach und ich versuche, TCP-Implementierung zu tun, um die Daten zu vergleichen. –