2011-10-11 8 views
2

안녕하세요, 네트워크에서 오디오를 보내는 데 문제가 있습니다. 거리가없는 로컬 시스템에는 아무런 문제가 없지만 원격 시스템에서 테스트 할 때마다 오디오가 있지만 음성 입력이 아니라 고르지/지연 등이 필요합니다. 오디오 전송을 어떻게 처리하는지 나는 지금 4 일 동안 노력했고 해결책을 찾을 수 없다.파이썬 오디오 오버 네트워크 문제

나는 모든 관련 코드를 게시하고 시도하고 그것을 최선을 설명합니다 내가 할 수

이 더 소음

를 허용 할

 

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

모든 아이디어를 크게하는 방법을 부탁드립니다

 

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

및 완성을위한

은 Tkinter를

에서 키보드의
 

    root.bind_all('', keypress) 

바인딩 오디오를 처리하는 서버 코드 그 키 누르기 방법을 필요에 따라 작동 시키거나 더 나은 방법을 제안 할 수 있습니다. 아니면 내가 완전히 잘못된 것을하고있을 수도 있습니다.

* 환호

내가

+0

무엇을하려하십니까? 음성 채팅 앱인가요? 사용자가 오디오를 보내기 위해 키를 누르고 있어야합니까? 인코딩하고 보내기 전에 5 초 동안 오디오를 녹음하는 이유는 무엇입니까? – jozzas

+0

Hey Jozzas 네, 음성 채팅 앱입니다. 5 초 녹음은 현재 주석 처리 된 몇 가지 사항을 테스트하는 것입니다 :-) 왼쪽 컨트롤 키를 누른 상태로 오디오를 전송해야하지만 내 로컬 시스템에서 말한 것처럼 그것은 잘 작동하지만 원격 시스템에 보낼 때 딸깍 소리가 나기를 클릭합니다 :-) 나는 약간의 샘플 속도로 연주를 시도했지만 실제로해야 할 일이 확실하지 않습니다. * 건배 귀하의 회신에 감사드립니다 – ADE

답변

0

당신이 두 호스트 간의 네트워크 성능을 테스트하기 위해 핑 또는 TTCP를 실행나요 :-) 암호화도 방법과 같은 일없이 테스트 한주의?

지연이 급증하거나 일부 패킷이 삭제 된 경우 음성 스트림 전송 방식이 나 빠지게됩니다. TCP는 누락 된 패킷을 기다리고, 손실되었다고보고하고, 재전송을 기다립니다.

누락 패킷을 정상적으로 처리하는 UDP 과도한 링크 및 오디오 압축을 사용해야합니다. 또한이 경우 발신 패킷의 타임 스탬프를 설정해야합니다.