2015-11-29 65 views
2

我使用UDP作爲客戶端和Python服務器,使用UDP將手機的麥克風輸入數據傳輸到PC。它工作正常,沒有錯誤。使用UDP與Python服務器從Android到PC的音頻流噪聲

但即使調整了很多,我的服務器端也有很多噪音。 我想知道我的代碼是否有問題或者它是正常的?

客戶:

public class MainActivity extends Activity { 
    private Button startButton,stopButton; 

    public byte[] buffer; 
    public static DatagramSocket socket; 
    private int port=8080; 

    AudioRecord recorder; 

    private int sampleRate = 44100 ; // 44100 for music 
    private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
    private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
    int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); 
    private boolean status = true; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     startButton = (Button) findViewById (R.id.start_button); 
     stopButton = (Button) findViewById (R.id.stop_button); 

     startButton.setOnClickListener (startListener); 
     stopButton.setOnClickListener (stopListener); 

    } 

    private final OnClickListener stopListener = new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      status = false; 
      recorder.release(); 
      Log.d("VS","Recorder released"); 
     } 

    }; 

    private final OnClickListener startListener = new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      status = true; 
      startStreaming(); 
     } 

    }; 

    public void startStreaming() { 


     Thread streamThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 

        DatagramSocket socket = new DatagramSocket(); 
        Log.d("VS", "Socket Created"); 

        byte[] buffer = new byte[minBufSize]; 

        Log.d("VS","Buffer created of size " + minBufSize); 
        DatagramPacket packet; 


        Log.d("VS", "Address retrieved"); 

        final InetAddress destination = InetAddress.getByName("10.0.0.2"); 
        Log.d("VS", "Address retrieved"); 


        recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize*10); 
        Log.d("VS", "Recorder initialized"); 

        recorder.startRecording(); 


        while(status == true) { 


         //reading data from MIC into buffer 
         minBufSize = recorder.read(buffer, 0, buffer.length); 

         //putting buffer in the packet 
         packet = new DatagramPacket (buffer,buffer.length,destination,port); 

         socket.send(packet); 

         System.out.println("MinBufferSize: " +minBufSize); 


        } 


       } catch(UnknownHostException e) { 
        Log.e("VS", "UnknownHostException",e); 


       } catch (IOException e) { 
        e.printStackTrace(); 
        Log.e("VS", ""+ e); 
       } 
      } 

     }); 
     streamThread.start(); 
    } 
} 

服務器:

import pyaudio 
import socket 
from threading import Thread 
import numpy as np 
from matplotlib import pyplot as plt 

frames = [] 

def udpStream(CHUNK): 

    udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    udp.bind(("0.0.0.0", 8080)) 

    while True: 
     # soundData, addr = udp.recvfrom(CHUNK) 
     soundData, addr = udp.recvfrom(CHUNK * CHANNELS * 2) 
     frames.append(soundData) 
     print numpydata 
     plt.plot(numpydata) 
     plt.show() 

    udp.close() 

def play(stream, CHUNK): 
    BUFFER = 10 
    while True: 
      if len(frames) == BUFFER: 
       while True: 
        try: 
         stream.write(frames.pop(0), CHUNK) 
        except: 
         pass 

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, 
        input=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

您的代碼不包括音頻安全緩衝處理抖動UDP網絡傳輸速率。基於WiFi的UDP既不是媒體同步也不是可靠的傳輸,因此可能需要預先填充的安全緩衝區的一小部分,以及平滑處理丟失的東西。

+0

通過tcp發送數據是否可以解決噪聲問題,因爲tcp不會像udp那樣丟棄數據包? –

+0

如果沒有緩衝,TCP可能會比UDP更差,因爲TCP握手的兩個方向的延遲都會受到物理現象的影響,從而惡化了典型的抖動。 – hotpaw2

+0

然後哪一個會是個不錯的選擇,通過wifi> =或者藍牙發送它? –