Przesyłaj strumieniowo Live Audio Android na serwer

Obecnie próbuję przesyłać strumieniowo dźwięk mikrofonu na żywo z urządzenia z systemem Android do programu Java. Zacząłem od wysłania dźwięku na żywo między dwoma urządzeniami z systemem Android, aby potwierdzić, że moja metoda była poprawna. Dźwięk można było doskonale słyszeć z niewielkim opóźnieniem na urządzeniu odbiorczym. Następnie wysyłam ten sam strumień audio do małego programu Java i sprawdziłem, czy dane zostały tutaj poprawnie wysłane. Teraz chcę kodować te dane i jakoś odtworzyć je na serwerze z uruchomionym programem Java. Wolę grać w przeglądarce internetowej przy użyciu HTML5 lub JavaScript, ale jestem otwarty na alternatywne metody, takie jak VLC.

Oto kod aplikacji na Androida, która wysyła dźwięk mikrofonu na żywo

public class MainActivity extends Activity {


private Button startButton,stopButton;

public byte[] buffer;
public static DatagramSocket socket;
    AudioRecord recorder;

private int sampleRate = 44100;   
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
protected 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);

     minBufSize += 2048;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

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


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


                recorder.startRecording();


                InetAddress IPAddress = InetAddress.getByName("192.168.1.5");
                byte[] sendData = new byte[1024];
                byte[] receiveData = new byte[1024];


                while (status == true)
                {
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 50005);
                    socket.send(sendPacket);
                }

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


        }

    });
    streamThread.start();
}
}

A oto kod programu Java odczytującego dane.

class Server
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(50005);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);



              serverSocket.receive(receivePacket);
              String sentence = new String( receivePacket.getData().toString());

              System.out.println("RECEIVED: " + sentence);
           }
  }
}

Wiem, że powinienem zakodować dźwięk po stronie aplikacji przed wysłaniem go do programu Java, ale nie jestem pewien, jak przejść do kodowania podczas korzystania z AudioRecorder. Wolałbym nie używać NDK, ponieważ nie mam z nim doświadczenia i nie mam czasu, aby nauczyć się go używać .... jeszcze :)

questionAnswers(3)

yourAnswerToTheQuestion