Android音訊實時傳輸與播放(二):服務端

yangxi_001發表於2015-04-15

原文連結:http://blog.csdn.net/zgyulongfei/article/details/7750707

我偷懶就用java寫了個簡單的伺服器,大家明白原理就好。

服務端共開放兩個埠,一個udp上行埠用來接收amr音訊流,另一個tcp下行埠用來傳送amr音訊流。

我這裡寫的服務端實現了組播的功能,即一個人在錄音,可以同時讓很多人同時聽到。

簡而言之,服務端做的唯一一件事情就是轉發音訊流,囧rz。。。


在這裡,我只貼出一部分程式碼,後面我會上傳資源供大家下載。


接收udp傳送的音訊碼流:

[java] view plaincopy
  1. while (isServerRunning()) {  
  2.     try {  
  3.         DatagramPacket pack = new DatagramPacket(data, data.length);  
  4.         udpServer.receive(pack);  
  5.         addPacketToBuffer(new FramePacket(pack.getData(), pack.getLength()));  
  6.     } catch (Exception e) {  
  7.         System.out.println(e.toString());  
  8.     }  
  9. }  

用tcp轉發收到的音訊流:

[java] view plaincopy
  1. public void sendDataToAllClient() throws Exception {  
  2.     if (isBufferEmpty() || clientList.size() <= 0) {  
  3.         return;  
  4.     }  
  5.     boolean bufEmpty = isBufferEmpty();  
  6.     byte[] block = takeAwayFirstFrame();  
  7.     ArrayList<Integer> disConnectClient = new ArrayList<Integer>();  
  8.     for (int ix = 0; ix < clientList.size(); ++ix) {  
  9.         Client client = clientList.get(ix);  
  10.         Socket clientSocket = client.getSocket();  
  11.           
  12.         if (clientSocket.isConnected()) {  
  13.             try {  
  14.                 if (!bufEmpty) {  
  15.                     if (block == null) {  
  16.                         continue;  
  17.                     }  
  18.                     OutputStream output = clientSocket.getOutputStream();  
  19.                     output.write(block);  
  20.                     output.flush();  
  21.                 }  
  22.             } catch (Exception err) {  
  23.                 disConnectClient.add(ix);  
  24.             }  
  25.         } else {  
  26.             disConnectClient.add(ix);  
  27.         }  
  28.     }  
  29.     for (int ix = 0; ix < disConnectClient.size(); ++ix) {  
  30.         int index = disConnectClient.get(ix);  
  31.         clientList.remove(index);  
  32.     }  
  33.     disConnectClient.clear();  
  34.     disConnectClient = null;  
  35.     block = null;  
  36. }  

相關文章