2014-01-16 3 views
7

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.

+0

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. –

+0

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

+0

@ 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. –

Antwort

7

Ich habe nach dem Grund für dieses Geräusch gesucht. Endlich konnte ich erkennen, warum das passierte.

Eigentlich, dieses Programm UDP-Transfer verursachte keinen Paketverlust.

Auch wenn es so ist, hat der Ton nicht so ein ernstes Geräusch.


Dieses Programm gesendet Daten richtig, und es gibt fast keine Paketverluste, aber die "receive" -Methode konnte Daten nicht korrekt empfangen.


In Serverprogramm

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() 

Dieses Programm könnte Daten nur "25%". (I die Menge der Daten geprüft)

Also habe ich versucht, die Daten mehrfach (SENDER * 2)

 soundData, addr = udp.recvfrom(CHUNK * CHANNELS * 2) 

Dies führt zu empfangen in den Tondaten 100% vollständig empfangen werden können.

Schließlich wird der von einem PC aufgenommene Ton ohne Rauschen auf dem anderen PC wiedergegeben.

Verwandte Themen