Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Streaming voice between Android Phones over WiFi

I'm trying to stream audio from the mic from 1 Android to another over WiFi. After looking at some examples I made 2 applications with a single activity in each, 1 to capture and send audio and the other to receive.

I've used the Audiorecord and Audiotrack classes to capture and play. However, i just hear some crackling sound (which has now stopped after i made some changes though i reverted back)

The activity to send voice.

public class VoiceSenderActivity extends Activity {  private EditText target; private TextView streamingLabel; private Button startButton,stopButton;  public byte[] buffer; public static DatagramSocket socket; private int port=50005;         //which port?? AudioRecord recorder;  //Audio Configuration.  private int sampleRate = 8000;      //How much will be ideal? private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;     private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;         private boolean status = true;     @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);      target = (EditText) findViewById (R.id.target_IP);     streamingLabel = (TextView) findViewById(R.id.streaming_label);     startButton = (Button) findViewById (R.id.start_button);     stopButton = (Button) findViewById (R.id.stop_button);      streamingLabel.setText("Press Start! to begin");      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 {                   int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);                 DatagramSocket socket = new DatagramSocket();                 Log.d("VS", "Socket Created");                  byte[] buffer = new byte[minBufSize];                  Log.d("VS","Buffer created of size " + minBufSize);                 DatagramPacket packet;                  final InetAddress destination = InetAddress.getByName(target.getText().toString());                 Log.d("VS", "Address retrieved");                   recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,minBufSize);                 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);                   }                } catch(UnknownHostException e) {                 Log.e("VS", "UnknownHostException");             } catch (IOException e) {                 Log.e("VS", "IOException");             }            }      });     streamThread.start();  }  } 

The activity to receive voice

public class VoiceReceiverActivity extends Activity {   private Button receiveButton,stopButton;  public static DatagramSocket socket; private AudioTrack speaker;  //Audio Configuration.  private int sampleRate = 8000;      //How much will be ideal? private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;     private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;         private boolean status = true;   @Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);      receiveButton = (Button) findViewById (R.id.receive_button);     stopButton = (Button) findViewById (R.id.stop_button);     findViewById(R.id.receive_label);      receiveButton.setOnClickListener(receiveListener);     stopButton.setOnClickListener(stopListener);  }   private final OnClickListener stopListener = new OnClickListener() {      @Override     public void onClick(View v) {         status = false;         speaker.release();         Log.d("VR","Speaker released");      }  };   private final OnClickListener receiveListener = new OnClickListener() {      @Override     public void onClick(View arg0) {         status = true;         startReceiving();      }  };  public void startReceiving() {      Thread receiveThread = new Thread (new Runnable() {          @Override         public void run() {              try {                  DatagramSocket socket = new DatagramSocket(50005);                 Log.d("VR", "Socket Created");                   byte[] buffer = new byte[256];                   //minimum buffer size. need to be careful. might cause problems. try setting manually if any problems faced                 int minBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);                  speaker = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,channelConfig,audioFormat,minBufSize,AudioTrack.MODE_STREAM);                  speaker.play();                  while(status == true) {                     try {                           DatagramPacket packet = new DatagramPacket(buffer,buffer.length);                         socket.receive(packet);                         Log.d("VR", "Packet Received");                          //reading content from packet                         buffer=packet.getData();                         Log.d("VR", "Packet data read into buffer");                          //sending data to the Audiotrack obj i.e. speaker                         speaker.write(buffer, 0, minBufSize);                         Log.d("VR", "Writing buffer content to speaker");                      } catch(IOException e) {                         Log.e("VR","IOException");                     }                 }               } catch (SocketException e) {                 Log.e("VR", "SocketException");             }           }      });     receiveThread.start(); }  } 

I used wireshark to check if the packets are being sent and i can see the packets. The source however, is the MAC address of the sending device and destination too something like a physical address. Not sure if this is relevant though.

So what's the problem with?

like image 268
Alabhya Avatar asked Feb 11 '12 06:02

Alabhya


People also ask

Can I stream audio over Wi-Fi?

audio transmission via a WiFi network, allowing the user's own device (smartphone or tablet) to act as the receiver. Suitable for a wide range of pro-audio applications where bring-your-own-device audio transmission is required, including assistive listening.

Can you stream audio to another phone?

Open up the music player on your host device and make sure that all your Android gadgets are connected to the same WiFi network. Then you can stream the audio and track information to phones or tablets running the companion SoundSeeder Speaker app.

How do I connect my Android to a wireless speaker?

Set up your system right from your Android smartphone, tablet or Kindle Fire. Use the Wi-Fi settings to connect new speakers to the network in just a few minutes. Give the speaker a name, and you're done. Add new speakers the same way.


1 Answers

Hey there is an Open Source library called "Libstreaming" that is used for streaming voice/video over the network using WIFI. Just Have a look at it:

https://github.com/fyhertz/libstreaming

There are also some examples provided, kindly have a look at it:

https://github.com/fyhertz/libstreaming-examples

I have used the library to Stream RTSP Audio over the network,hope it may be useful.

like image 54
user3482497 Avatar answered Oct 09 '22 21:10

user3482497