2014-01-16 10 views
7

この問題の解決方法はわかりません。助けてください:)UDPのサウンド転送:再生されたサウンドに大きなノイズがあります

1台のPCで録音した音声データを他のPCに送信して再生したいと思います。 (UDPによる)

プログラムは正しく動作するかもしれませんが、サウンドには(?)不快なノイズが含まれています。 &のサウンドを1つのプログラムシーケンスで録音しようとしたところ、正しく動作しました。騒音はなかった。 1台のPCでもUDPを使用する場合、IP 127.0.0.1を使用するとノイズが発生します。 まず、他のPCで演奏された音が出ていて、バッファを作って固定していたからです。 それはほとんどノイズを解決しませんでしたが、ほとんどすべてのノイズはまだ残っています。

次のコードは、それが

クライアントである

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

サーバー

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

長いソースコードのために申し訳ありません。お気軽にこのプログラムをプレイしてください。

+0

データが壊れている(パケットロスやデータ処理が間違っているなどの理由で)データが壊れているのですか?それとも、タイミングが遅くなります(タイミング/レイテンシ/並行性に問題がありますかストリームの再生をデカップリングしてストリームを再生するには、Pythonの 'threading'が正しい選択であるかどうか確かめてください) –

+0

送信されたものと受け取ったものを互いに比較する必要があります。 – Alfe

+0

@ Jan-PhilipGehrcke「画像」UDP転送のバージョンが正しく動作したため、パケットロスが発生していませんでした。ありがとうございました!パケットロスについて考えて、データを比較するためにTCP実装を試みます。 –

答えて

7

このノイズの原因を調査しました。最後に、なぜこれが起こったのかを知ることができました。

実際、このプログラムのUDP転送によってパケットが失われることはありません。

でも、音質に大きな騒音はありません。


このプログラムはデータを正しく送信し、パケット損失はほとんどありませんが、「受信」メソッドはデータを正しく受信できませんでした。サーバプログラム

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

このプログラムができる唯一の "25%" のデータで


。したがって

を(私はデータの量をチェックする)、Iは、音声データで

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

この結果完全に100%を受け取ることができるデータの乗算(* 2チャネル)を受信することを試みました。

最後に、1台のPCで記録されたサウンドは、ノイズのない別のPCで再生されます。

関連する問題