我正在尝试通过wi-Fi将实时音频从一部Android手机的麦克风传输到另一部。在做了一些研究后,我已经能够以一种方式做到这一点。我的意思是我能够使用收件人的IP地址向他发送语音消息,但我想要两种方式(如语音通话)。
收件人收到消息后,他也应该能够同时回复。我已经使用了Audiorecord和Audiotrack课程来捕捉和播放。 接收语音的活动是:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ReceiveVoice extends Activity {
private Button receiveButton, stopButton;
public static DatagramSocket socket;
private AudioTrack speaker;
private InetAddress senerIp=null;
// Audio Configuration.
private int sampleRate = 16000;
//private int sampleRate = 44100; // How much will be ideal?
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
private boolean status = true;
AudioRecord recorder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.receivevoice);
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.v("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.v("VR", "Socket Created");
byte[] buffer = new byte[4096];
Log.v("VR", "buffer Created");
// minimum buffer size. need to be careful. might cause
// problems. try setting manually if any problems faced
//27052015int minBufSize = AudioRecord.getMinBufferSize(sampleRate,
//27052015 channelConfig, audioFormat);
int minBufSize = 4096;
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.v("VR", "Packet Received");
// reading content from packet
buffer = packet.getData();
Log.v("VR", "Packet data read into buffer");
// sending data to the Audiotrack obj i.e. speaker
speaker.write(buffer, 0, minBufSize);
Log.v("VR", "Writing buffer content to speaker");
senerIp=packet.getAddress();
Log.v("IP", "sender ip:"+senerIp);
// startStreaming(senerIp);
} catch (IOException e) {
Log.e("VR", "IOException");
}
}
} catch (SocketException e) {
Log.e("VR", "SocketException");
}
}
});
receiveThread.start();
}
public void startStreaming(final InetAddress ip) {
Thread streamThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Log.v("VR", "Inside startstreming");
int minBufSize = AudioRecord.getMinBufferSize(sampleRate,
channelConfig, audioFormat);
Log.v("VS", "creating socket");
DatagramSocket socket = new DatagramSocket(50005);
Log.v("VS", "Socket Created");
byte[] buffer = new byte[minBufSize];
Log.v("VS", "Buffer created of size " + minBufSize);
DatagramPacket packet;
final InetAddress destination = ip;
Log.v("VS", "Address retrieved");
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, channelConfig, audioFormat, minBufSize);
Log.v("VS", "Recorder initialized");
recorder.startRecording();
// Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
Log.v("VS", "Recorder started");
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, 50005);
Log.v("VS", "packet started");
socket.send(packet);
Log.v("VS", "packet sent");
}
} catch (UnknownHostException e) {
Log.e("VS", "UnknownHostException");
} catch (IOException e) {
Log.e("VS", "IOException");
}
}
});
streamThread.start();
}
}
发送语音的活动是:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class SendVoice 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 = 44100; // How much will be ideal?
private int sampleRate = 44100;
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.sendvoice);
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) {
// TODO Auto-generated method stub
status = false;
recorder.release();
Log.v("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(port);
Log.v("VS", "Socket Created");
byte[] buffer = new byte[minBufSize];
Log.v("VS", "Buffer created of size " + minBufSize);
DatagramPacket packet;
final InetAddress destination = InetAddress
.getByName(target.getText().toString());
Log.v("VS", "Address retrieved");
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRate, channelConfig, audioFormat, minBufSize);
Log.v("VS", "Recorder initialized");
recorder.startRecording();
// Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show();
Log.v("VS", "Recorder started");
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);
Log.v("VS", "packet started");
socket.send(packet);
Log.v("VS", "packet sent");
}
} catch (UnknownHostException e) {
Log.e("VS", "UnknownHostException");
} catch (IOException e) {
Log.e("VS", "IOException");
}
}
});
streamThread.start();
}
}
任何可以帮助我修改此代码以使其成为双向呼叫的建议都会非常感激。