2011-10-11 77 views
2

您好,我在通过网络发送音频时遇到问题。在我的本地系统没有距离没有问题,但每当我在远程系统上测试有音频,但它不是语音输入,我想它的波涛汹涌/ laggy等我相信它在我如何处理发送的音频,但我已经尝试了4天,无法找到解决方案。通过网络问题的Python音频

,我将发布所有相关的代码,并试图解释尽我所能

这些都是常数/全局值

 

    #initilaize Speex 
    speex_enc = speex.Encoder() 
    speex_enc.initialize(speex.SPEEX_MODEID_WB) 
    speex_dec = speex.Decoder() 
    speex_dec.initialize(speex.SPEEX_MODEID_WB) 

    #some constant values 
    chunk = 320 
    FORMAT = pyaudio.paInt16 
    CHANNELS = 1 
    RATE = 44100 

我发现调节采样率值将允许更多的噪音

下面是pyAudio代码初始化音频设备,这也是全球

 

    #initalize PyAudio 
    p = pyaudio.PyAudio() 
    stream = p.open(format = FORMAT, 
        channels = CHANNELS, 
        rate = RATE, 
        input = True, 
        output = True, 
        frames_per_buffer = chunk) 

这个下一个功能是从麦克风写入数据并使用客户端功能发送数据的按键功能。这是我相信我遇到问题的地方。

我相信我是如何处理这个问题的,因为如果我按住它来获取音频,它会在每次迭代中循环发送。我不确定这里要做什么。 (想法!)

 

    def keypress(event): 
     #chunklist = [] 
     #RECORD_SECONDS = 5 
     if event.keysym == 'Escape': 
      root.destroy() 
     #x = event.char 
     if event.keysym == 'Control_L': 
      #for i in range(0, 44100/chunk * RECORD_SECONDS): 
      try: 
       #get data from mic 
       data = stream.read(chunk) 
      except IOError as ex: 
       if ex[1] != pyaudio.paInputOverflowed: 
        raise 
       data = '\x00' * chunk 
      encdata = speex_enc.encode(data)  #Encode the data. 
      #chunklist.append(encdata) 
      #send audio 
      client(chr(CMD_AUDIO), encrypt_my_audio_message(encdata)) 

服务器代码来处理音频键盘的Tkinter的

 

    root.bind_all('', keypress) 

任何想法是极大的赞赏如何

 

    ### Server function ### 
    def server(): 
     PORT = 9001 
     ### Initialize socket 
     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     server_socket.bind((socket.gethostbyname(socket.gethostname()), PORT)) 
     # socket.gethostbyname(socket.gethostname()) 
     server_socket.listen(5) 
     read_list = [server_socket] 
     ### Start receive loop 
     while True: 
      readable, writable, errored = select.select(read_list, [], []) 
      for s in readable: 
       if s is server_socket: 
        conn, addr = s.accept() 
        read_list.append(conn) 
        print "Connection from ", addr 
       else: 
        msg = conn.recv(2048) 
        if msg:     
         cmd, msg = ord(msg[0]),msg[1:] 
         ## get a text message from GUI 
         if cmd == CMD_MSG: 
          listb1.insert(END, decrypt_my_message(msg).strip() + "\n") 
          listb1.yview(END) 
         ## get an audio message 
         elif cmd == CMD_AUDIO: 
          # make sure length is 16 --- HACK --- 
          if len(msg) % 16 != 0: 
           msg += '\x00' * (16 - len(msg) % 16) 
          #decrypt audio 
          data = decrypt_my_message(msg) 
          decdata = speex_dec.decode(data) 
          #Write the data back out to the speaker 
          stream.write(decdata, chunk) 
        else: 
         s.close() 
         read_list.remove(s) 

,并完成绑定我可以根据需要使该按键方法正常工作,或者提出更好的方法,或者我可以完全做错事

*欢呼

请注意,我已经测试过它没有加密的方法也和同样的事情:-)

+0

你想做什么?这是一个语音聊天应用程序吗?应该要求用户按住一个键才能发送音频?为什么在编码和发送之前录制5秒的音频? – jozzas

+0

嘿Jozzas是这是一个语音聊天应用程序和五秒录音只是为了测试一些当前被注释掉的东西:-)它应该是你按住左侧的控制键并发送音频,但就像我说的在我的本地系统它工作正常,但发送到远程系统时,我听到单击单击单击:-)我试着玩取样率有点,但我真的不确定需要做什么*欢呼谢谢你的回复 – ADE

回答

0

你运行ping或TTCP测试2个主机之间的网络性能?

如果您有延迟尖峰或者某些数据包丢失,您的发送语音流的方法将受到严重影响。 TCP将等待丢失的数据包,报告丢失数据,等待重新发送等。

您应该使用有损链路和音频压缩的UDP,以正常处理丢失的数据包。同样在这种情况下,您必须为传出数据包添加时间戳。