9

この問題を解決する方法がわかりません。私を助けてください :)

一方の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()

ソースコードが長くてすみません。このプログラムを自由にプレイしてください。

4

2 に答える 2

10

この異音の原因を調べてみました。最後に、なぜこれが起こったのかを突き止めることができました。

実際、このプログラムの 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%」しかデータ化できませんでした。(データ量は調べました)

というわけで、データを掛けて受信してみました(CHANNELS*2)

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

これにより、音声データを 100% 完全に受信できます。

最後に、一方の PC で録音された音声が、もう一方の PC でノイズなしで再生されます。

于 2014-02-15T04:41:51.047 に答える