轉載請註明出處!
原文連結:http://blog.csdn.net/zgyulongfei/article/details/7750707
我偷懶就用java寫了個簡單的伺服器,大家明白原理就好。
服務端共開放兩個連接埠,一個udp上行連接埠用來接收amr音頻流,另一個tcp下行連接埠用來發送amr音頻流。
我這裡寫的服務端實現了組播的功能,即一個人在錄音,可以同時讓很多人同時聽到。
簡而言之,服務端做的唯一一件事情就是轉寄音頻流,囧rz。。。
在這裡,我只貼出一部分代碼,後面我會上傳資源供大家下載。
接收udp傳送的音頻碼流:
while (isServerRunning()) {try {DatagramPacket pack = new DatagramPacket(data, data.length);udpServer.receive(pack);addPacketToBuffer(new FramePacket(pack.getData(), pack.getLength()));} catch (Exception e) {System.out.println(e.toString());}}
用tcp轉寄收到的音頻流:
public void sendDataToAllClient() throws Exception {if (isBufferEmpty() || clientList.size() <= 0) {return;}boolean bufEmpty = isBufferEmpty();byte[] block = takeAwayFirstFrame();ArrayList<Integer> disConnectClient = new ArrayList<Integer>();for (int ix = 0; ix < clientList.size(); ++ix) {Client client = clientList.get(ix);Socket clientSocket = client.getSocket();if (clientSocket.isConnected()) {try {if (!bufEmpty) {if (block == null) {continue;}OutputStream output = clientSocket.getOutputStream();output.write(block);output.flush();}} catch (Exception err) {disConnectClient.add(ix);}} else {disConnectClient.add(ix);}}for (int ix = 0; ix < disConnectClient.size(); ++ix) {int index = disConnectClient.get(ix);clientList.remove(index);}disConnectClient.clear();disConnectClient = null;block = null;}