原文链接: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;
- }