2014-01-16 117 views
7

我不知道如何解决这个问题。请帮助我:)UDP声音传输:播放声音有很大的噪音

我想将一台PC录制的声音数据发送到另一台PC并播放它。 (通过UDP)

程序可能正常工作,但声音包含(?)不舒服的噪音。 当我试图在一个程序序列中播放&播放声音时,它工作正常。没有噪音。 即使在一台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传输并没有造成数据包丢失。

即使这样做,声音也没有这么严重的噪音。


该程序正确发送数据,几乎没有丢包,但“receive”方法无法正确接收数据。


在服务器程序

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检查的数据的量)

所以,我试图接收该数据的乘法(CHANNELS * 2)

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

这导致了声音的数据可以被完全接收100%。

最后,一台PC录制的声音在另一台PC上播放,没有噪音。